Introduction
Preventing unintended pregnancy is critical for individual well-being
and public health. Unprotected sex occurs for multiple, complex reasons
including sexual assault, reproductive coercion, contraceptive mishaps,
and lapses in contraceptive use Cleland et al.
(2014) . Emergency
contraception prevents pregnancy following unprotected sex or
contraceptive failure. In Scotland emergency contraception is available
as either a pill or intrauterine device. Oral contraceptives are the
most used form, making up 90% of emergency contraceptive prescriptions@Emergency23.
Pharmacies in Scotland dispense two types of emergency contraceptive
pills (ECP):
- Levonorgestrel (brand name: Levonelle) -
Effective within 72 hours (three days) of unprotected sex
- Ulipristal Acetate (brand name: ellaOne)
- Effective within 120 hours (five days) of unprotected sex
This analysis explores the factors influencing prescribing trends for
ECP in Scotland from 2019 to 2022, using data from the Public Health
Scotland Community Prescriptions Database. By investigating ECP patterns
over time, geography and socioeconomic status, this report aims to
identify disparities in access and inform strategies to improve public
health outcomes.
The analysis addresses the following questions:
- What are the trends in prescribing of ECP between 2019 and
2022?
- How does the ECP prescription rate vary by Health Board regions in
Scotland?
- Are pharmacies in more deprived areas prescribing more ECP than
those in affluent areas?
- Is there geographical variation in prescribing practices of ECP by
Health Board region?
Load necessary libraries:
library(tidyverse)
library(janitor)
library(gt)
library(here)
library(lubridate)
library(sf)
library(ggspatial)
library(plotly)
Read in datasets:
# Read in the Health Board names (HB_names). See code for link.
HB_names <- read_csv("https://www.opendata.nhs.scot/dataset/9f942fdb-e59e-44f5-b534-d6e17229cc7b/resource/652ff726-e676-4a20-abda-435b98dd7bdc/download/hb14_hb19.csv") %>%
clean_names() # ensures column names are unique, lower case and spaces and special characters are replaced with underscores. I will use this function for all read ins to ensure my data is consistent and easy to manipulate.
# Read in population data per Health Board from the 2022 census data. Available from: https://statistics.ukdataservice.ac.uk/dataset/scotland-s-census-2022-uv102a-age-by-sex/resource/b2d295c2-af53-4b3d-a075-7815cadd9060
all_population_data <- read_csv(here("data", "UV103_age_health_board_census.csv"), skip = 10) %>% # locates the csv and excludes the first 10 lines in the csv as they are redundant
rename(Spare = "...6", # remove unused columns
hb_name = "Health Board Area 2019",
hb_population = Count) %>% # rename() formats the data to match the prescriptions dataframe
filter(Sex == "Female") %>% # filter female population, as men do not take ECP
select(hb_name, Age, hb_population) %>% # select columns of interest
mutate(hb_name = paste("NHS", hb_name)) %>% # change hb_name column format to match the Health Board dataframe format
clean_names()
# filter dataset for the total female population for each health board:
population_data <- all_population_data %>%
filter(age == "All people") %>%
select(hb_name, hb_population)
# select the population aged 16 to 34 years as this is the population the population most likely engaging with risk taking behaviors such as unprotected sex. I chose 16 as this is the age of consent in Scotland, and 34 as my cut off for young adults.
young_population_data <- all_population_data %>%
filter(age%in% c(16:34)) %>% # filter ages of interest
mutate(age = as.numeric(age)) %>% # make numerical so they can be placed in to buckets
mutate(age_group = case_when(between(age, 16,34)~'16-34')) %>% # make bucket 16-34 years
group_by(hb_name, age_group) %>%
summarise(pop_hb_16_34 = sum(hb_population)) # sum total population aged 16 to 34 per health board region.
Define a function to read in the prescription data
for a defined year:
#For efficiency I created a function to read in the prescriptions datasets. I downloaded 12 months of prescription data for each year from 2019 to 2022. I placed the 12 months of data into their relevant folder named all_months_year, where year was specific to the data it contained.
read_all_prescriptions <- function(year){
all_files <- list.files(here("data", paste0("all_months_", year)), pattern = "csv") #list.files() retrieves files from the relevant directory, and the paste0() dynamically constructs the folder name based on the year variable placed into the function.
all_prescriptions <- all_files %>%
map_dfr(~read_csv(here("data", paste0("all_months_", year),.))) %>% #map_dfr() row-binds the datasets being read in
clean_names() %>%
drop_na(bnf_item_description) # drop the rows with missing bnf_item values
return(all_prescriptions)}
Read in datasets using read_all_prescriptions()
function and start data wrangling:
# all_prescriptions_2019 <- read_all_prescriptions(2019)
# all_prescriptions_2020 <- read_all_prescriptions(2020)
# all_prescriptions_2021 <- read_all_prescriptions(2021)
# all_prescriptions_2022 <- read_all_prescriptions(2022)
#
# # 2019 dataset has hbt2014 as a column name instead of hbt. Rename to make column name consistent
# all_prescriptions_2019 <- all_prescriptions_2019 %>%
# rename(hbt = "hbt2014")
#
# # combine 4 years of data into one dataset to make it easier to wrangle
# combined_prescriptions <- bind_rows(
# all_prescriptions_2019,
# all_prescriptions_2020,
# all_prescriptions_2021,
# all_prescriptions_2022 )%>% # I mutate and select the prescriptions of interest to prevent a very large dataset from being stored in my environment (prevents R slowing down and crashing)
# mutate(
# date = parse_date_time(paid_date_month, "ym"), # use lubridate to format date
# drug_simple = case_when(
# str_detect(bnf_item_description, "LEVONO") ~ "Levonorgestrel",
# str_detect(bnf_item_description, "ULIPR") ~ "Ulipristal Acetate",
# TRUE ~ "Other")) %>% # used case_when() to select ECP even when they have different dosages
# filter(drug_simple != "Other",!is.na(date)) %>% #remove prescriptions of no interest and any missing date values
# filter(hbt != "SB0806") %>% # filter out SB0806 as it is not a health board (Scottish Ambulance Service)
# filter(!is.na(hbt))
# save combined_prescriptions dataset to a csv in my directory, to prevent many large datasets being stored in my environment and slowing down R.
# write_csv(combined_prescriptions,"data/combined_prescriptions.csv")
combined_prescriptions <- read_csv(here("data","combined_prescriptions.csv"))
Join and wrangle data naming the output variable
ECP_scripts:
# join the prescriptions dataset to the Health Board names and health board population datasets
ECP_scripts <- combined_prescriptions %>%
full_join(HB_names, by = c("hbt" = "hb")) %>% # join with Health Board names
full_join(population_data, by = "hb_name") %>% # join with population data
select(gp_practice, date, drug = drug_simple, hb_name, paid_quantity,hb_population) %>% # select columns of interest
mutate(month = factor(month(date), levels = 1:12, labels = month.abb), .after = date) %>%
mutate(year = factor(year(date)), .after = month) # extract month and year as a factor with labels to help when plotting
Key Results
What are the trends in prescribing of ECP between 2019 and
2022?
# calculate total population of Scotland
total_population <- sum(population_data$hb_population, na.rm=TRUE)
# calculate the number of prescriptions of each drug per month
ECP_by_month <- ECP_scripts %>%
group_by(date, drug, month, year) %>%
summarise(total_quantity_month = sum(paid_quantity, na.rm = TRUE)) %>%
ungroup() %>%
drop_na(drug) %>%
clean_names()
# calculate prescription rate per 100,000 people for each drug and month
ECP_trend_plot_data <- ECP_by_month %>%
group_by(drug, year, month) %>%
summarise(prescriptions_per_100000 = (total_quantity_month / total_population)*100000)
ECP_trend_plot <- ECP_trend_plot_data %>%
ggplot(aes(x = month, y = prescriptions_per_100000, group = year, linetype = year, color = year)) + # plot data for each year on same graph
geom_line(aes(size = ifelse(year == "2020", 0.9, 0.7))) + # make the 2020 line slightly thicker to make it stand out
facet_wrap(~drug, scales = "free_y") + # separate the two types of ECP
scale_linetype_manual(values = c("2019" = "dotdash", "2020" = "solid", "2021" = "dashed", "2022" = "dotted"),name = "Year") + # make each year identifiable by linte type
scale_color_manual(values = c("2019" = "grey70", "2020" = "#4575b4", "2021" = "grey70", "2022" = "grey70"),name = "Year") + # make Covid-19 year blue (2020 had the longest lockdown, March till May)
scale_size_identity() + # ensures ggplot uses the size values as outlined in geom_line()
scale_y_continuous(limits = c(0, NA), breaks = scales::pretty_breaks(n = 5))+ # ensure y-axis starts at 0 and has evenly spaced breaks
labs(
title = "Trends in Emergency Contraception Prescribing 2019–2022 \n in Scotland.",
subtitle = "Four years of population adjusted prescribing rates\n highlighting the impact of Covid-19 (blue)",
x = "Month",
y = "Prescriptions per 100,000 women") +
theme_minimal() +
theme(
plot.title = element_text(size = 18, hjust = 0.5, face = "bold"),
plot.subtitle = element_text(size = 14, hjust = 0.5),
axis.title.x = element_text(size = 12),
axis.title.y = element_text(size = 12),
axis.text.x = element_text(angle = 45, hjust = 1, size = 9),
axis.text.y = element_text(size = 9),
strip.text = element_text(size = 12),
legend.title = element_text(size = 12),
legend.text = element_text(size = 12),
legend.position = "bottom",
plot.margin = margin(10, 30, 10, 30)) # increase size of margins
ECP_trend_plot
Figure 1 explores if there is monthly variation in prescribing rate
of ECP for the years 2019 to 2022. I included 4 years of consecutive
data to see if a one-time event, such as the Covid-19 pandemic or the
Common Wealth Games affects ECP prescribing rate.
Due to low prescribing rates of ECP there is stochastic variation on
graphical representation of the data. Interesting trends to note
include:
Levonorgestrel is more commonly prescribed than Ulipristal
Acetate. Each month an average of 150 prescriptions of Levonorgestrel
and 3 prescriptions of Ulipristal Acetate are dispensed per 100,000
women across Scotland.
The prescribing rate of Levonorgestrel has decreased each year
between 2019 to 2022. This may be due to public health interventions to
encourage use of long-acting reversible contraception, reducing the need
for ECP. Alternatively this decrease may be due to difficulties in
accessing ECP after the Covid-19 pandemic.
There is a significant decrease in the prescription rate of
Ulipristal Acetate between 2019 and all consecutive years. This likely
reflects the change in prescription guidance in 2020, where the European
Medicines Agency recommended withdrawing Ulipristal Acetate as a
treatment for uterine fibroids due to safety concerns. Prescriptions of
Ulipristal Acetate from 2020 are specific for ECP.
In each year there are peaks in the Summer months suggesting
there may be a ‘Summer of Love’.
Between February and May of 2020 the prescription rate of
Levonorgestrel decreases greatly. This coincides with the Phase 1
Covid-19 lockdown. This suggests that the national ‘lockdown’ reduced
opportunity to engage in unprotected sexual intercourse.
How does the ECP prescription rate vary by Health Board regions in
Scotland?
Wrangle data to get the columns and values of interest:
ECP_anual_rate_data <- ECP_scripts %>%
group_by(hb_name, drug) %>% # aggregate data by Health Board and drug
summarise(total_quantity_4_years = sum(paid_quantity, na.rm = TRUE), # total prescriptions over 4 years
avg_annual_total_quantity = total_quantity_4_years / 4, # average annual prescriptions
hb_population = first(hb_population), # hb_population is consistent within each hb_name
.groups = "drop") %>% # ungroup data
drop_na(drug) %>% # remove rows with no drug values
mutate(avg_annual_presc_100000 = avg_annual_total_quantity * 100000 / hb_population) %>% # average annual rate of prescriptions per 100,000
select(hb_name, drug, avg_annual_presc_100000, hb_population) %>% # select columns of interest before pivot
pivot_wider(names_from = drug, values_from = avg_annual_presc_100000, names_glue = "{drug}_rate") %>% # Rename columns for clarity
clean_names() # clean column names following pivot
# calculate total ECP prescription rate per health board
ECP_anual_rate_data <- ECP_anual_rate_data %>%
mutate(total_ECP_rate = rowSums(select(., levonorgestrel_rate, ulipristal_acetate_rate), na.rm = TRUE)) %>% #sum rates
arrange(desc(total_ECP_rate)) # arrange by total rate in descending order
#calculate percentage young people per health board to explore if there is an association here
ECP_anual_rate_data_young <- ECP_anual_rate_data %>%
full_join(young_population_data) %>% # to get the population of those aged 16-34 years
group_by(hb_name) %>%
mutate(prop_young_ppl_hb = pop_hb_16_34/hb_population) %>% # calculate proportion of young people in each health board
ungroup()
Plot table 1:
annual_avg_ECP_table <- ECP_anual_rate_data_young %>%
select(hb_name, levonorgestrel_rate, ulipristal_acetate_rate, total_ECP_rate,prop_young_ppl_hb) %>% # Select relevant columns
gt() %>%
cols_label(hb_name = "Health Board",
total_ECP_rate= "Total",
levonorgestrel_rate= " Levonorgestrel",
ulipristal_acetate_rate=" Ulipristal Acetate",
prop_young_ppl_hb = "% Aged 16-34 Years") %>% # rename columns to make reader-friendly
fmt_number(columns = c(levonorgestrel_rate, ulipristal_acetate_rate, total_ECP_rate, prop_young_ppl_hb), decimals = 0) %>% # no decimal points as false accuracy detracts from the message in the data
cols_align(align = "center", columns = c(levonorgestrel_rate,ulipristal_acetate_rate,total_ECP_rate, prop_young_ppl_hb)) %>% # centre column names
grand_summary_rows(columns = c(levonorgestrel_rate,ulipristal_acetate_rate, total_ECP_rate), fns = list("Overall Average" = ~mean(., na.rm = TRUE)), fmt = list(~ fmt_number(., decimals = 0))) %>% # add an overall average for the rate columns
fmt_percent(columns = prop_young_ppl_hb, decimals = 0) %>% # add percentage sign
tab_header(title = md("**Average Annual Rate of Emergency Contraception Prescriptions by Health Board in Scotland.**"),
subtitle = md("Rate per 100,000 women, derived from the mean prescription rates across the years 2019 to 2022. Health Boards are ranked in descending order.")) %>% # add a title and subtitle; md() allows text formatting from mark down
tab_spanner(label = md("*Prescription rate per 100,000 women*"), columns = c(levonorgestrel_rate,ulipristal_acetate_rate, total_ECP_rate)) %>% # add a title to the rate columns.
tab_source_note(md("*Data from Public Health Scotland. Available from: (https://www.opendata.nhs.scot/dataset/prescriptions-in-the-community)*")) %>%
tab_stubhead(md("**2019-2022**")) %>%
tab_footnote(footnote = "includes Capital City, Edinburgh", locations = cells_body(columns = hb_name, rows = 2))%>%
opt_stylize(style = 6, color = "blue")
annual_avg_ECP_table
| Average Annual Rate of Emergency Contraception Prescriptions by Health Board in Scotland. |
| Rate per 100,000 women, derived from the mean prescription rates across the years 2019 to 2022. Health Boards are ranked in descending order. |
| 2019-2022 |
Health Board |
Prescription rate per 100,000 women
|
% Aged 16-34 Years |
| Levonorgestrel |
Ulipristal Acetate |
Total |
|
NHS Greater Glasgow and Clyde |
3,376 |
29 |
3,404 |
26% |
|
NHS Lothian |
2,495 |
56 |
2,551 |
27% |
|
NHS Ayrshire and Arran |
2,027 |
15 |
2,043 |
19% |
|
NHS Tayside |
1,365 |
22 |
1,387 |
22% |
|
NHS Forth Valley |
1,268 |
73 |
1,342 |
22% |
|
NHS Grampian |
1,210 |
16 |
1,226 |
22% |
|
NHS Fife |
1,049 |
54 |
1,103 |
22% |
|
NHS Lanarkshire |
784 |
48 |
832 |
22% |
|
NHS Shetland |
779 |
17 |
796 |
19% |
|
NHS Orkney |
609 |
7 |
616 |
17% |
|
NHS Dumfries and Galloway |
515 |
24 |
539 |
17% |
|
NHS Western Isles |
192 |
197 |
389 |
16% |
|
NHS Highland |
285 |
52 |
337 |
17% |
|
NHS Borders |
242 |
76 |
318 |
17% |
| Overall Average |
— |
1,157 |
49 |
1,206 |
— |
| Data from Public Health Scotland. Available from: (https://www.opendata.nhs.scot/dataset/prescriptions-in-the-community) |
Table 1 shows that NHS Greater Glasgow and Clyde, and NHS Lothian
have the highest annual ECP prescription rate. Interestingly these
Health Board regions contain the major Scottish cities, Glasgow and
Edinburgh.
Generally the health boards with the highest annual ECP prescription
rate also had the highest proportion of young people living in their
health board region. This may suggest that young people aged 16 to 34
years are more likely to require emergency contraception.
NHS Ayrshire and Arran is an outlier to this trend having the third
highest ECP prescription rate, and yet a relatively smaller proportion
of young people living in this health board (19%). This needs further
exploration, perhaps indicating that under 16s or over 35s are using the
ECP services more in this region.
More remote and rural Health Boards such as NHS Highland and NHS
Borders had the lowest rate of ECP prescribing. They also had a smaller
proportion of young people living in their health board.
When comparing the type of ECP prescribed table 1 shows that
levonorgestrel is more commonly prescribed than Ulipristal Acetate.
However this is not the case in the NHS Western Isles Health Board,
where a similar proportion of Levonorgestrel is prescribed to Ulipristal
Acetate. This perhaps highlights disparity in the prescribing practices
by health board region. This is explored further in figure 3.
Are pharmacies in more deprived areas prescribing more ECP than
those in affluent areas?
Read in and wrangle data:
# To measure deprivation I have used the Scottish Index of Multiple Deprivation. 2020v2 dataset from Public Health Scotland. (link available in code)
SIMD <- read_csv("https://www.opendata.nhs.scot/gl/dataset/78d41fa9-1a62-4f7b-9edb-3e8522a93378/resource/acade396-8430-4b34-895a-b3e757fa346e/download/simd2020v2_22062020.csv") %>%
clean_names() %>%
select(data_zone, simd2020v2hb_decile)
# I chose to use GP Practices and List Sizes from October 2022, as this was the closest dataset I could find which correlated with the final year of my prescriptions dataset:
gp_addresses <- read_csv("https://www.opendata.nhs.scot/dataset/f23655c3-6e23-4103-a511-a80d998adb90/resource/1a15cb34-fcf9-4d3f-ad63-1ba3e675fbe2/download/practice_contactdetails_oct2022-open-data.csv") %>%
clean_names() %>%
select(practice_code, gp_practice_name, data_zone)
# Create ECP_GP by using the GP_addresses dataset to map the GP practice code to a datazone. I then used the column datazone to full_join() the SIMD dataset to the prescriptions dataset.
ECP_GP <- ECP_scripts %>%
filter(!gp_practice %in% c(99996, 99997, 99998)) %>% # remove dummy GP practice codes as they do not have a known gp practice code so cannot be mapped to a SIMD.
left_join(gp_addresses, by = c("gp_practice" = "practice_code")) %>%
#left_join(data_zones, by = "data_zone") %>%
left_join(SIMD, by = "data_zone") %>%
drop_na(simd2020v2hb_decile) %>% # need SIMD value to for plot
group_by(gp_practice) %>%
mutate(total_quantity_per_gp = sum(paid_quantity)) %>%
clean_names()
# calculate the number of GPs per SIMD (account for each SIMD having a different number of GPs)
toal_no_GP_per_SIMD <- ECP_GP %>%
group_by(simd2020v2hb_decile) %>%
mutate(unique_gp_count_per_SIMD = n_distinct(gp_practice))
Plot figure 2:
ECP_SIMD_barchart <- toal_no_GP_per_SIMD %>%
group_by(simd2020v2hb_decile, drug) %>%
summarise(prescriptions_gp = (total_quantity_per_gp / unique_gp_count_per_SIMD), # calculate the prescriptions per GP for each SIMD decile and drug
.groups = "drop") %>% # Ungroup data after summarisation
ggplot(aes(x = factor(simd2020v2hb_decile, levels = 1:10),y = prescriptions_gp, fill = drug, text = paste("Decile:", simd2020v2hb_decile, "<br>Drug:", drug))) + # customise hover box for interactive chart
geom_col() +
scale_fill_manual(values = c("#4575b4", "#91bfdb"), name = "Drug Type") + # add colour palette
labs(title = "Emergency Contraception Prescriptions by \n Scottish Index of Multiple Deprivation (SIMD) 2019 to 2022, \n normalised by number of GPs per SIMD decile.",
x = "SIMD Decile \n (1 = Most Deprived, 10 = Least Deprived)",
y = "Total Prescriptions",
fill = "Drug") +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 12, hjust = 0.5),
axis.title.x = element_text(size = 12),
axis.title.y = element_text(size = 12),
axis.text.x = element_text(size = 10, hjust = 1),
axis.text.y = element_text(size = 10),
legend.position = "right",
legend.title = element_text(size = 12, face = "bold"),
legend.text = element_text(size = 10))
ECP_SIMD_barchart <- ggplotly(ECP_SIMD_barchart, tooltip = "text") # make plot interactive
ECP_SIMD_barchart
Generally as SIMD decile increases the number of prescriptions of ECP
decreases. GPs in SIMD1, the most deprived areas, prescribe the most ECP
whilst increasing affluence is related to decreasing number of ECP
prescribed. This suggests those in deprived areas are utilising ECP
more, highlighting an inequality in health need. Perhaps this disparity
is due to education, safe practices, environmental factors, access to
long acting-reversible contraception.
Is there geographical variation in the prescribing practices of ECP
by Health Board region?
I wanted to explore if there was any correlation between the type of
contraception being prescribed and the location of the pharmacy. To do
this I calculated the ratio of total levonorgestrel prescriptions to
total emergency contraception prescriptions for each Health Board
Region.
\[
\frac{Levonorgestrel}{Levonorgestrel + Ulipristal Acetate}
\]
A score close to one suggest the majority of prescriptions in this
region are Levonorgestrel, whilst a score closer to zero indicates the
majority of prescriptions are Ulipristal Acetate. This is a useful way
of identifying variation in prescribing practices.
Figure 3:
# load the NHS Health board Shapefile downloaded from learn page
NHS_healthboards <- st_read(here("data", "NHS_healthboards_2019.shp")) %>%
mutate(HBName = paste("NHS", HBName)) %>% # format to match ECP_scripts dataset
clean_names()
## Reading layer `NHS_healthboards_2019' from data source
## `C:\Data_science\B273025\data\NHS_healthboards_2019.shp' using driver `ESRI Shapefile'
## Simple feature collection with 14 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 7564.996 ymin: 530635.8 xmax: 468754.8 ymax: 1218625
## Projected CRS: OSGB36 / British National Grid
# calculate the ratio of Lev to Uli prescribed
variation_ECP_prescribed <- ECP_scripts %>%
group_by(hb_name,drug) %>%
# calculate the total of Lev and Uli prescribed per health board
summarise(total_each_drug_type = sum(paid_quantity, na.rm = TRUE)) %>%
drop_na(drug) %>%
#pivot_wider to move drug names to columns
pivot_wider(names_from = drug, values_from = total_each_drug_type) %>%
clean_names() %>% # consistency
mutate(levo_to_uli_ratio = levonorgestrel / (levonorgestrel + ulipristal_acetate)) # calculate ratio
# Join spatial data with variation_ECP_prescribed
variation_ECP_prescribed <- NHS_healthboards %>%
left_join(variation_ECP_prescribed)
#Create map in ggplot
map_variation_ECP_prescribed <- variation_ECP_prescribed %>%
ggplot(aes(fill = levo_to_uli_ratio)) +
geom_sf(size = 0.1, colour = "grey50", alpha =0.9) +
scale_fill_distiller(palette = "Blues", direction = 1) +
labs(title = "Geographical variation in Emergency Contraceptive \n Pill prescribing in Scotland.",
subtitle = "Heatmap showing Levonorgestrel prescriptions as a proportion of total \n Emergency Contraceptive Pill (ECP) prescriptions by Health Board region",
fill = "Levonorgestrel to ECP ratio", caption = "Data Source: Public Health Scotland Prescriptions in the Community, 2019-2022") +
coord_sf() +
theme_void() +
theme(
plot.title = element_text(face = "bold", size = 18, hjust=0.5),
plot.subtitle = element_text(size = 14, hjust=0.5),
legend.title = element_text(size = 12),
legend.text = element_text(size = 9, hjust=0.5),
legend.direction = "vertical",
legend.box = "horizontal") +
annotation_scale(location = "tl") +
annotation_north_arrow(
location = "tl",
pad_y = unit(0.5, "in"),
style = north_arrow_nautical(fill = c("grey40", "white"),line_col = "grey20"))
map_variation_ECP_prescribed
Health Board Regions in central Scotland predominantly prescribe
Levonorgestrel. More remote and rural Health Board regions such as the
NHS Western Isles appear to prescribe more Ulipristal Acetate. This
difference in prescribing practice may highlight a disparity in ability
to quickly access emergency contraception in remote and rural regions.
Patients may present later to health services later, meaning prescribers
dispense Ulipristal Acetate which has the longer time frame of 5 day.
Alternatively this variation in prescribing practise may be due to
differences in prescriber preferences in more remote areas.
Conclusion
Prescriptions of ECP are decreasing over the years. During 2020 there
was a significant reduction in prescription of Levonorgestrel likely due
to Covid-19 lockdown. When looking at Ulipristal Acetate a clear
reduction from 2019 to 2020 onwards reflects change in prescribing
guidance, no longer prescribed for uterine fibroids.
Health Board regions with more young people and big cities had a
higher rate of ECP precriptions. Ayr and Arran was a slight outlier to
this pattern having a slightly reduced YP population and yet high
prevelance of ECP prescription. Interesting to explore this further.
More ECPs were perscribed with increasing deprivation.
Geographicly - more remote pharmacies appeared to prescribe higher
amounts of Ulipristal Acetate. Is this due to challenges in accessing
pharmacy within 48 hours of unprotected sex,
In conclusion prescribing patterns of ECP are determined by societal
events, such as Covid or Summer, age, geography and deprivation.
Recommendations from analysis
This report highlights that there are disparities in prescribing of
emergency contraception across geography and social groups in Scotland.
Further investigations into the reasons behind these trends is necessary
to inform future sexual health policy making and reduce health
inequality.
Limitations of the dataset and suggestions for future analysis
This report assumes that Levonorgestrel and Ulipristal Acetate are
dispensed purely for emergency contraception, and have no off-licence
uses.
Differences in the volume of ECP prescribed in Health Boards may be
due to patients living in one area but accessing ECP from another Health
Board.
Prescription dataset had ‘dummy practice codes’ for prescriptions
which did not have a practice code. This excluded a large number of ECP
prescriptions from the ECP-deprivation analysis as it was impossible to
link them to a datazone and subsequent SIMD decile.
With additional time it would be interesting to design a directed
acyclic graphic to visually and mathematically model the probabilistic
relationships between variables such as age, deprivation and geography
influencing prescribing patterns in Scotland. It would be interesting to
explore whether there are statistical relationships in the trends
observed in this report.
LS0tDQp0aXRsZTogIkFzc2Vzc21lbnQ6IEV4cGxvcmF0b3J5IEFuYWx5c2lzIG9mIHRoZSBGYWN0b3JzIEluZmx1ZW5jaW5nIEVtZXJnZW5jeSBDb250cmFjZXB0aXZlIFByZXNjcmliaW5nIGluIFNjb3RsYW5kIg0KYXV0aG9yOiAiQjI3MzAyNSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCmJpYmxpb2dyYXBoeTogIi4uL3JlZmVyZW5jZXMuanNvbiINCmxpbmstY2l0YXRpb25zOiB0cnVlDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICB0aGVtZTogZmxhdGx5DQoNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGNhY2hlPUZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA3KSAjIGFsaWduIGZpZ3VyZXMgdG8gY2VudHJlIGFuZCBzZXQgZGltZW5zaW9ucyB0byBwcmV2ZW50IHRoZW0gYmVpbmcgY3V0IG9mZiANCmBgYA0KDQojIEludHJvZHVjdGlvbiANCg0KUHJldmVudGluZyB1bmludGVuZGVkIHByZWduYW5jeSBpcyBjcml0aWNhbCBmb3IgaW5kaXZpZHVhbCB3ZWxsLWJlaW5nIGFuZCBwdWJsaWMgaGVhbHRoLiBVbnByb3RlY3RlZCBzZXggb2NjdXJzIGZvciBtdWx0aXBsZSwgY29tcGxleCByZWFzb25zIGluY2x1ZGluZyBzZXh1YWwgYXNzYXVsdCwgcmVwcm9kdWN0aXZlIGNvZXJjaW9uLCBjb250cmFjZXB0aXZlIG1pc2hhcHMsIGFuZCBsYXBzZXMgaW4gY29udHJhY2VwdGl2ZSB1c2UgQGNsZWxhbmRfZXRhbDE0IC4gRW1lcmdlbmN5IGNvbnRyYWNlcHRpb24gcHJldmVudHMgcHJlZ25hbmN5IGZvbGxvd2luZyB1bnByb3RlY3RlZCBzZXggb3IgY29udHJhY2VwdGl2ZSBmYWlsdXJlLiBJbiBTY290bGFuZCBlbWVyZ2VuY3kgY29udHJhY2VwdGlvbiBpcyBhdmFpbGFibGUgYXMgZWl0aGVyIGEgcGlsbCBvciBpbnRyYXV0ZXJpbmUgZGV2aWNlLiBPcmFsIGNvbnRyYWNlcHRpdmVzIGFyZSB0aGUgbW9zdCB1c2VkIGZvcm0sIG1ha2luZyB1cCA5MCUgb2YgZW1lcmdlbmN5IGNvbnRyYWNlcHRpdmUgcHJlc2NyaXB0aW9uc0BFbWVyZ2VuY3kyMy4gDQoNClBoYXJtYWNpZXMgaW4gU2NvdGxhbmQgZGlzcGVuc2UgdHdvIHR5cGVzIG9mIGVtZXJnZW5jeSBjb250cmFjZXB0aXZlIHBpbGxzIChFQ1ApOg0KDQo+KiAqKkxldm9ub3JnZXN0cmVsICoqIChicmFuZCBuYW1lOiAqTGV2b25lbGxlKikgLSBFZmZlY3RpdmUgd2l0aGluIDcyIGhvdXJzICh0aHJlZSBkYXlzKSBvZiB1bnByb3RlY3RlZCBzZXgNCj4qICoqVWxpcHJpc3RhbCBBY2V0YXRlICoqIChicmFuZCBuYW1lOiAqZWxsYU9uZSopIC0gRWZmZWN0aXZlIHdpdGhpbiAxMjAgaG91cnMgKGZpdmUgZGF5cykgb2YgdW5wcm90ZWN0ZWQgc2V4ICANCg0KVGhpcyBhbmFseXNpcyBleHBsb3JlcyB0aGUgZmFjdG9ycyBpbmZsdWVuY2luZyBwcmVzY3JpYmluZyB0cmVuZHMgZm9yIEVDUCBpbiBTY290bGFuZCBmcm9tIDIwMTkgdG8gMjAyMiwgdXNpbmcgZGF0YSBmcm9tIHRoZSBQdWJsaWMgSGVhbHRoIFNjb3RsYW5kIENvbW11bml0eSBQcmVzY3JpcHRpb25zIERhdGFiYXNlLiBCeSBpbnZlc3RpZ2F0aW5nIEVDUCBwYXR0ZXJucyBvdmVyIHRpbWUsIGdlb2dyYXBoeSBhbmQgc29jaW9lY29ub21pYyBzdGF0dXMsIHRoaXMgcmVwb3J0IGFpbXMgdG8gaWRlbnRpZnkgZGlzcGFyaXRpZXMgaW4gYWNjZXNzIGFuZCBpbmZvcm0gc3RyYXRlZ2llcyB0byBpbXByb3ZlIHB1YmxpYyBoZWFsdGggb3V0Y29tZXMuIA0KDQpUaGUgYW5hbHlzaXMgYWRkcmVzc2VzIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOiANCg0KPiAxKSBXaGF0IGFyZSB0aGUgdHJlbmRzIGluIHByZXNjcmliaW5nIG9mIEVDUCBiZXR3ZWVuIDIwMTkgYW5kIDIwMjI/IA0KPiAyKSBIb3cgZG9lcyB0aGUgRUNQIHByZXNjcmlwdGlvbiByYXRlIHZhcnkgYnkgSGVhbHRoIEJvYXJkIHJlZ2lvbnMgaW4gU2NvdGxhbmQ/DQo+IDMpIEFyZSBwaGFybWFjaWVzIGluIG1vcmUgZGVwcml2ZWQgYXJlYXMgcHJlc2NyaWJpbmcgbW9yZSBFQ1AgdGhhbiB0aG9zZSBpbiBhZmZsdWVudCBhcmVhcz8NCj4gNCkgSXMgdGhlcmUgZ2VvZ3JhcGhpY2FsIHZhcmlhdGlvbiBpbiBwcmVzY3JpYmluZyBwcmFjdGljZXMgb2YgRUNQIGJ5IEhlYWx0aCBCb2FyZCByZWdpb24/DQoNCkxvYWQgbmVjZXNzYXJ5IGxpYnJhcmllczoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGphbml0b3IpIA0KbGlicmFyeShndCkgDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGdnc3BhdGlhbCkNCmxpYnJhcnkocGxvdGx5KQ0KYGBgDQoNClJlYWQgaW4gZGF0YXNldHM6DQpgYGB7cn0NCiMgUmVhZCBpbiB0aGUgSGVhbHRoIEJvYXJkIG5hbWVzIChIQl9uYW1lcykuIFNlZSBjb2RlIGZvciBsaW5rLg0KSEJfbmFtZXMgPC0gcmVhZF9jc3YoImh0dHBzOi8vd3d3Lm9wZW5kYXRhLm5ocy5zY290L2RhdGFzZXQvOWY5NDJmZGItZTU5ZS00NGY1LWI1MzQtZDZlMTcyMjljYzdiL3Jlc291cmNlLzY1MmZmNzI2LWU2NzYtNGEyMC1hYmRhLTQzNWI5OGRkN2JkYy9kb3dubG9hZC9oYjE0X2hiMTkuY3N2IikgJT4lIA0KICBjbGVhbl9uYW1lcygpICMgZW5zdXJlcyBjb2x1bW4gbmFtZXMgYXJlIHVuaXF1ZSwgbG93ZXIgY2FzZSBhbmQgc3BhY2VzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggdW5kZXJzY29yZXMuIEkgd2lsbCB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgYWxsIHJlYWQgaW5zIHRvIGVuc3VyZSBteSBkYXRhIGlzIGNvbnNpc3RlbnQgYW5kIGVhc3kgdG8gbWFuaXB1bGF0ZS4NCg0KIyBSZWFkIGluIHBvcHVsYXRpb24gZGF0YSBwZXIgSGVhbHRoIEJvYXJkIGZyb20gdGhlIDIwMjIgY2Vuc3VzIGRhdGEuIEF2YWlsYWJsZSBmcm9tOiBodHRwczovL3N0YXRpc3RpY3MudWtkYXRhc2VydmljZS5hYy51ay9kYXRhc2V0L3Njb3RsYW5kLXMtY2Vuc3VzLTIwMjItdXYxMDJhLWFnZS1ieS1zZXgvcmVzb3VyY2UvYjJkMjk1YzItYWY1My00YjNkLWEwNzUtNzgxNWNhZGQ5MDYwIA0KYWxsX3BvcHVsYXRpb25fZGF0YSA8LSByZWFkX2NzdihoZXJlKCJkYXRhIiwgIlVWMTAzX2FnZV9oZWFsdGhfYm9hcmRfY2Vuc3VzLmNzdiIpLCBza2lwID0gMTApICU+JSAjIGxvY2F0ZXMgdGhlIGNzdiBhbmQgZXhjbHVkZXMgdGhlIGZpcnN0IDEwIGxpbmVzIGluIHRoZSBjc3YgYXMgdGhleSBhcmUgcmVkdW5kYW50DQogIHJlbmFtZShTcGFyZSA9ICIuLi42IiwgIyByZW1vdmUgdW51c2VkIGNvbHVtbnMNCiAgICAgICAgIGhiX25hbWUgPSAiSGVhbHRoIEJvYXJkIEFyZWEgMjAxOSIsDQogICAgICAgICBoYl9wb3B1bGF0aW9uID0gQ291bnQpICU+JSAjIHJlbmFtZSgpIGZvcm1hdHMgdGhlIGRhdGEgdG8gbWF0Y2ggdGhlIHByZXNjcmlwdGlvbnMgZGF0YWZyYW1lDQogIGZpbHRlcihTZXggPT0gIkZlbWFsZSIpICU+JSAjIGZpbHRlciBmZW1hbGUgcG9wdWxhdGlvbiwgYXMgbWVuIGRvIG5vdCB0YWtlIEVDUA0KICBzZWxlY3QoaGJfbmFtZSwgQWdlLCBoYl9wb3B1bGF0aW9uKSAlPiUgIyBzZWxlY3QgY29sdW1ucyBvZiBpbnRlcmVzdA0KICBtdXRhdGUoaGJfbmFtZSA9IHBhc3RlKCJOSFMiLCBoYl9uYW1lKSkgJT4lICAjIGNoYW5nZSBoYl9uYW1lIGNvbHVtbiBmb3JtYXQgdG8gbWF0Y2ggdGhlIEhlYWx0aCBCb2FyZCBkYXRhZnJhbWUgZm9ybWF0DQogIGNsZWFuX25hbWVzKCkNCg0KIyBmaWx0ZXIgZGF0YXNldCBmb3IgdGhlIHRvdGFsIGZlbWFsZSBwb3B1bGF0aW9uIGZvciBlYWNoIGhlYWx0aCBib2FyZDoNCnBvcHVsYXRpb25fZGF0YSA8LSBhbGxfcG9wdWxhdGlvbl9kYXRhICU+JSANCiAgZmlsdGVyKGFnZSA9PSAiQWxsIHBlb3BsZSIpICU+JSANCiAgc2VsZWN0KGhiX25hbWUsIGhiX3BvcHVsYXRpb24pDQoNCiMgc2VsZWN0IHRoZSBwb3B1bGF0aW9uIGFnZWQgMTYgdG8gMzQgeWVhcnMgYXMgdGhpcyBpcyB0aGUgcG9wdWxhdGlvbiB0aGUgcG9wdWxhdGlvbiBtb3N0IGxpa2VseSBlbmdhZ2luZyB3aXRoIHJpc2sgdGFraW5nIGJlaGF2aW9ycyBzdWNoIGFzIHVucHJvdGVjdGVkIHNleC4gSSBjaG9zZSAxNiBhcyB0aGlzIGlzIHRoZSBhZ2Ugb2YgY29uc2VudCBpbiBTY290bGFuZCwgYW5kIDM0IGFzIG15IGN1dCBvZmYgZm9yIHlvdW5nIGFkdWx0cy4gDQp5b3VuZ19wb3B1bGF0aW9uX2RhdGEgPC0gYWxsX3BvcHVsYXRpb25fZGF0YSAlPiUgDQogIGZpbHRlcihhZ2UlaW4lIGMoMTY6MzQpKSAlPiUgIyBmaWx0ZXIgYWdlcyBvZiBpbnRlcmVzdA0KICBtdXRhdGUoYWdlID0gYXMubnVtZXJpYyhhZ2UpKSAlPiUgIyBtYWtlIG51bWVyaWNhbCBzbyB0aGV5IGNhbiBiZSBwbGFjZWQgaW4gdG8gYnVja2V0cw0KICBtdXRhdGUoYWdlX2dyb3VwID0gY2FzZV93aGVuKGJldHdlZW4oYWdlLCAxNiwzNCl+JzE2LTM0JykpICU+JSAjIG1ha2UgYnVja2V0IDE2LTM0IHllYXJzDQogIGdyb3VwX2J5KGhiX25hbWUsIGFnZV9ncm91cCkgJT4lIA0KICBzdW1tYXJpc2UocG9wX2hiXzE2XzM0ID0gc3VtKGhiX3BvcHVsYXRpb24pKSAjIHN1bSB0b3RhbCBwb3B1bGF0aW9uIGFnZWQgMTYgdG8gMzQgcGVyIGhlYWx0aCBib2FyZCByZWdpb24uIA0KDQpgYGANCg0KKipEZWZpbmUgYSBmdW5jdGlvbioqIHRvIHJlYWQgaW4gdGhlIHByZXNjcmlwdGlvbiBkYXRhIGZvciBhIGRlZmluZWQgeWVhcjoNCmBgYHtyfQ0KI0ZvciBlZmZpY2llbmN5IEkgY3JlYXRlZCBhIGZ1bmN0aW9uIHRvIHJlYWQgaW4gdGhlIHByZXNjcmlwdGlvbnMgZGF0YXNldHMuIEkgZG93bmxvYWRlZCAxMiBtb250aHMgb2YgcHJlc2NyaXB0aW9uIGRhdGEgZm9yIGVhY2ggeWVhciBmcm9tIDIwMTkgdG8gMjAyMi4gSSBwbGFjZWQgdGhlIDEyIG1vbnRocyBvZiBkYXRhIGludG8gdGhlaXIgcmVsZXZhbnQgZm9sZGVyIG5hbWVkIGFsbF9tb250aHNfeWVhciwgd2hlcmUgeWVhciB3YXMgc3BlY2lmaWMgdG8gdGhlIGRhdGEgaXQgY29udGFpbmVkLg0KcmVhZF9hbGxfcHJlc2NyaXB0aW9ucyA8LSBmdW5jdGlvbih5ZWFyKXsNCiAgYWxsX2ZpbGVzIDwtIGxpc3QuZmlsZXMoaGVyZSgiZGF0YSIsIHBhc3RlMCgiYWxsX21vbnRoc18iLCB5ZWFyKSksIHBhdHRlcm4gPSAiY3N2IikgI2xpc3QuZmlsZXMoKSByZXRyaWV2ZXMgZmlsZXMgZnJvbSB0aGUgcmVsZXZhbnQgZGlyZWN0b3J5LCBhbmQgdGhlIHBhc3RlMCgpIGR5bmFtaWNhbGx5IGNvbnN0cnVjdHMgdGhlIGZvbGRlciBuYW1lIGJhc2VkIG9uIHRoZSB5ZWFyIHZhcmlhYmxlIHBsYWNlZCBpbnRvIHRoZSBmdW5jdGlvbi4NCiAgYWxsX3ByZXNjcmlwdGlvbnMgPC0gYWxsX2ZpbGVzICU+JQ0KICAgIG1hcF9kZnIofnJlYWRfY3N2KGhlcmUoImRhdGEiLCBwYXN0ZTAoImFsbF9tb250aHNfIiwgeWVhciksLikpKSAlPiUgI21hcF9kZnIoKSByb3ctYmluZHMgdGhlIGRhdGFzZXRzIGJlaW5nIHJlYWQgaW4NCiAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgIGRyb3BfbmEoYm5mX2l0ZW1fZGVzY3JpcHRpb24pICMgZHJvcCB0aGUgcm93cyB3aXRoIG1pc3NpbmcgYm5mX2l0ZW0gdmFsdWVzDQogIHJldHVybihhbGxfcHJlc2NyaXB0aW9ucyl9DQpgYGANCg0KUmVhZCBpbiBkYXRhc2V0cyB1c2luZyAqKnJlYWRfYWxsX3ByZXNjcmlwdGlvbnMoKSoqIGZ1bmN0aW9uIGFuZCBzdGFydCBkYXRhIHdyYW5nbGluZzoNCmBgYHtyfQ0KIyBhbGxfcHJlc2NyaXB0aW9uc18yMDE5IDwtIHJlYWRfYWxsX3ByZXNjcmlwdGlvbnMoMjAxOSkNCiMgYWxsX3ByZXNjcmlwdGlvbnNfMjAyMCA8LSByZWFkX2FsbF9wcmVzY3JpcHRpb25zKDIwMjApDQojIGFsbF9wcmVzY3JpcHRpb25zXzIwMjEgPC0gcmVhZF9hbGxfcHJlc2NyaXB0aW9ucygyMDIxKQ0KIyBhbGxfcHJlc2NyaXB0aW9uc18yMDIyIDwtIHJlYWRfYWxsX3ByZXNjcmlwdGlvbnMoMjAyMikNCiMgDQojICMgMjAxOSBkYXRhc2V0IGhhcyBoYnQyMDE0IGFzIGEgY29sdW1uIG5hbWUgaW5zdGVhZCBvZiBoYnQuIFJlbmFtZSB0byBtYWtlIGNvbHVtbiBuYW1lIGNvbnNpc3RlbnQNCiMgYWxsX3ByZXNjcmlwdGlvbnNfMjAxOSA8LSBhbGxfcHJlc2NyaXB0aW9uc18yMDE5ICU+JQ0KIyAgIHJlbmFtZShoYnQgPSAiaGJ0MjAxNCIpDQojIA0KIyAjIGNvbWJpbmUgNCB5ZWFycyBvZiBkYXRhIGludG8gb25lIGRhdGFzZXQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd3JhbmdsZQ0KIyBjb21iaW5lZF9wcmVzY3JpcHRpb25zIDwtIGJpbmRfcm93cygNCiMgICBhbGxfcHJlc2NyaXB0aW9uc18yMDE5LA0KIyAgIGFsbF9wcmVzY3JpcHRpb25zXzIwMjAsDQojICAgYWxsX3ByZXNjcmlwdGlvbnNfMjAyMSwNCiMgICBhbGxfcHJlc2NyaXB0aW9uc18yMDIyICklPiUgIyBJIG11dGF0ZSBhbmQgc2VsZWN0IHRoZSBwcmVzY3JpcHRpb25zIG9mIGludGVyZXN0IHRvIHByZXZlbnQgYSB2ZXJ5IGxhcmdlIGRhdGFzZXQgZnJvbSBiZWluZyBzdG9yZWQgaW4gbXkgZW52aXJvbm1lbnQgKHByZXZlbnRzIFIgc2xvd2luZyBkb3duIGFuZCBjcmFzaGluZykNCiMgICBtdXRhdGUoDQojICAgICBkYXRlID0gcGFyc2VfZGF0ZV90aW1lKHBhaWRfZGF0ZV9tb250aCwgInltIiksICMgdXNlIGx1YnJpZGF0ZSB0byBmb3JtYXQgZGF0ZQ0KIyAgICAgZHJ1Z19zaW1wbGUgPSBjYXNlX3doZW4oDQojICAgICAgIHN0cl9kZXRlY3QoYm5mX2l0ZW1fZGVzY3JpcHRpb24sICJMRVZPTk8iKSB+ICJMZXZvbm9yZ2VzdHJlbCIsDQojICAgICAgIHN0cl9kZXRlY3QoYm5mX2l0ZW1fZGVzY3JpcHRpb24sICJVTElQUiIpIH4gIlVsaXByaXN0YWwgQWNldGF0ZSIsDQojICAgICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lICMgdXNlZCBjYXNlX3doZW4oKSB0byBzZWxlY3QgRUNQIGV2ZW4gd2hlbiB0aGV5IGhhdmUgZGlmZmVyZW50IGRvc2FnZXMNCiMgICBmaWx0ZXIoZHJ1Z19zaW1wbGUgIT0gIk90aGVyIiwhaXMubmEoZGF0ZSkpICU+JSAjcmVtb3ZlIHByZXNjcmlwdGlvbnMgb2Ygbm8gaW50ZXJlc3QgYW5kIGFueSBtaXNzaW5nIGRhdGUgdmFsdWVzDQojICAgZmlsdGVyKGhidCAhPSAiU0IwODA2IikgJT4lICMgZmlsdGVyIG91dCBTQjA4MDYgYXMgaXQgaXMgbm90IGEgaGVhbHRoIGJvYXJkIChTY290dGlzaCBBbWJ1bGFuY2UgU2VydmljZSkNCiMgICBmaWx0ZXIoIWlzLm5hKGhidCkpDQoNCiMgc2F2ZSBjb21iaW5lZF9wcmVzY3JpcHRpb25zIGRhdGFzZXQgdG8gYSBjc3YgaW4gbXkgZGlyZWN0b3J5LCB0byBwcmV2ZW50IG1hbnkgbGFyZ2UgZGF0YXNldHMgYmVpbmcgc3RvcmVkIGluIG15IGVudmlyb25tZW50IGFuZCBzbG93aW5nIGRvd24gUi4gDQojIHdyaXRlX2Nzdihjb21iaW5lZF9wcmVzY3JpcHRpb25zLCJkYXRhL2NvbWJpbmVkX3ByZXNjcmlwdGlvbnMuY3N2IikNCmNvbWJpbmVkX3ByZXNjcmlwdGlvbnMgPC0gcmVhZF9jc3YoaGVyZSgiZGF0YSIsImNvbWJpbmVkX3ByZXNjcmlwdGlvbnMuY3N2IikpDQpgYGANCg0KSm9pbiBhbmQgd3JhbmdsZSBkYXRhIG5hbWluZyB0aGUgb3V0cHV0IHZhcmlhYmxlICoqRUNQX3NjcmlwdHMqKjoNCmBgYHtyfQ0KIyBqb2luIHRoZSBwcmVzY3JpcHRpb25zIGRhdGFzZXQgdG8gdGhlIEhlYWx0aCBCb2FyZCBuYW1lcyBhbmQgaGVhbHRoIGJvYXJkIHBvcHVsYXRpb24gZGF0YXNldHMNCkVDUF9zY3JpcHRzIDwtIGNvbWJpbmVkX3ByZXNjcmlwdGlvbnMgJT4lIA0KICBmdWxsX2pvaW4oSEJfbmFtZXMsIGJ5ID0gYygiaGJ0IiA9ICJoYiIpKSAlPiUgIyBqb2luIHdpdGggSGVhbHRoIEJvYXJkIG5hbWVzDQogIGZ1bGxfam9pbihwb3B1bGF0aW9uX2RhdGEsIGJ5ID0gImhiX25hbWUiKSAlPiUgIyBqb2luIHdpdGggcG9wdWxhdGlvbiBkYXRhDQogIHNlbGVjdChncF9wcmFjdGljZSwgZGF0ZSwgZHJ1ZyA9IGRydWdfc2ltcGxlLCBoYl9uYW1lLCBwYWlkX3F1YW50aXR5LGhiX3BvcHVsYXRpb24pICU+JSAgIyBzZWxlY3QgY29sdW1ucyBvZiBpbnRlcmVzdA0KICBtdXRhdGUobW9udGggPSBmYWN0b3IobW9udGgoZGF0ZSksIGxldmVscyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYiksIC5hZnRlciA9IGRhdGUpICU+JSAgIA0KICBtdXRhdGUoeWVhciA9IGZhY3Rvcih5ZWFyKGRhdGUpKSwgLmFmdGVyID0gbW9udGgpICMgZXh0cmFjdCBtb250aCBhbmQgeWVhciBhcyBhIGZhY3RvciB3aXRoIGxhYmVscyB0byBoZWxwIHdoZW4gcGxvdHRpbmcNCmBgYA0KDQojIEtleSBSZXN1bHRzIA0KDQojIyBXaGF0IGFyZSB0aGUgdHJlbmRzIGluIHByZXNjcmliaW5nIG9mIEVDUCBiZXR3ZWVuIDIwMTkgYW5kIDIwMjI/IA0KDQpgYGB7ciB0aW1lX3RyZW5kLCBmaWcuY2FwPSAiRmlndXJlIDE6IFByZXNjcmliaW5nIHRyZW5kcyBvZiBFbWVyZ2VuY3kgQ29udHJhY2VwdGlvbiBmcm9tIDIwMTkgdG8gMjAyMiJ9DQoNCiMgY2FsY3VsYXRlIHRvdGFsIHBvcHVsYXRpb24gb2YgU2NvdGxhbmQNCnRvdGFsX3BvcHVsYXRpb24gPC0gc3VtKHBvcHVsYXRpb25fZGF0YSRoYl9wb3B1bGF0aW9uLCBuYS5ybT1UUlVFKSANCg0KIyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwcmVzY3JpcHRpb25zIG9mIGVhY2ggZHJ1ZyBwZXIgbW9udGgNCkVDUF9ieV9tb250aCA8LSBFQ1Bfc2NyaXB0cyAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgZHJ1ZywgbW9udGgsIHllYXIpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfcXVhbnRpdHlfbW9udGggPSBzdW0ocGFpZF9xdWFudGl0eSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRyb3BfbmEoZHJ1ZykgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCiMgY2FsY3VsYXRlIHByZXNjcmlwdGlvbiByYXRlIHBlciAxMDAsMDAwIHBlb3BsZSBmb3IgZWFjaCBkcnVnIGFuZCBtb250aA0KRUNQX3RyZW5kX3Bsb3RfZGF0YSA8LSBFQ1BfYnlfbW9udGggJT4lDQogIGdyb3VwX2J5KGRydWcsIHllYXIsIG1vbnRoKSAlPiUgDQogIHN1bW1hcmlzZShwcmVzY3JpcHRpb25zX3Blcl8xMDAwMDAgPSAodG90YWxfcXVhbnRpdHlfbW9udGggLyB0b3RhbF9wb3B1bGF0aW9uKSoxMDAwMDApDQoNCkVDUF90cmVuZF9wbG90IDwtIEVDUF90cmVuZF9wbG90X2RhdGEgJT4lDQogIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gcHJlc2NyaXB0aW9uc19wZXJfMTAwMDAwLCBncm91cCA9IHllYXIsIGxpbmV0eXBlID0geWVhciwgY29sb3IgPSB5ZWFyKSkgKyAjIHBsb3QgZGF0YSBmb3IgZWFjaCB5ZWFyIG9uIHNhbWUgZ3JhcGgNCiAgZ2VvbV9saW5lKGFlcyhzaXplID0gaWZlbHNlKHllYXIgPT0gIjIwMjAiLCAwLjksIDAuNykpKSArICMgbWFrZSB0aGUgMjAyMCBsaW5lIHNsaWdodGx5IHRoaWNrZXIgdG8gbWFrZSBpdCBzdGFuZCBvdXQgDQogIGZhY2V0X3dyYXAofmRydWcsIHNjYWxlcyA9ICJmcmVlX3kiKSArICMgc2VwYXJhdGUgdGhlIHR3byB0eXBlcyBvZiBFQ1ANCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoIjIwMTkiID0gImRvdGRhc2giLCAiMjAyMCIgPSAic29saWQiLCAiMjAyMSIgPSAiZGFzaGVkIiwgIjIwMjIiID0gImRvdHRlZCIpLG5hbWUgPSAiWWVhciIpICsgIyBtYWtlIGVhY2ggeWVhciBpZGVudGlmaWFibGUgYnkgbGludGUgdHlwZQ0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiMjAxOSIgPSAiZ3JleTcwIiwgIjIwMjAiID0gIiM0NTc1YjQiLCAiMjAyMSIgPSAiZ3JleTcwIiwgIjIwMjIiID0gImdyZXk3MCIpLG5hbWUgPSAiWWVhciIpICsgIyBtYWtlIENvdmlkLTE5IHllYXIgYmx1ZSAoMjAyMCBoYWQgdGhlIGxvbmdlc3QgbG9ja2Rvd24sIE1hcmNoIHRpbGwgTWF5KQ0KICBzY2FsZV9zaXplX2lkZW50aXR5KCkgKyAjIGVuc3VyZXMgZ2dwbG90IHVzZXMgdGhlIHNpemUgdmFsdWVzIGFzIG91dGxpbmVkIGluIGdlb21fbGluZSgpDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIE5BKSwgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKG4gPSA1KSkrICMgZW5zdXJlIHktYXhpcyBzdGFydHMgYXQgMCBhbmQgaGFzIGV2ZW5seSBzcGFjZWQgYnJlYWtzIA0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRyZW5kcyBpbiBFbWVyZ2VuY3kgQ29udHJhY2VwdGlvbiBQcmVzY3JpYmluZyAyMDE54oCTMjAyMiBcbiBpbiBTY290bGFuZC4iLA0KICAgIHN1YnRpdGxlID0gIkZvdXIgeWVhcnMgb2YgcG9wdWxhdGlvbiBhZGp1c3RlZCBwcmVzY3JpYmluZyByYXRlc1xuICBoaWdobGlnaHRpbmcgdGhlIGltcGFjdCBvZiBDb3ZpZC0xOSAoYmx1ZSkiLA0KICAgIHggPSAiTW9udGgiLA0KICAgIHkgPSAiUHJlc2NyaXB0aW9ucyBwZXIgMTAwLDAwMCB3b21lbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDkpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMzAsIDEwLCAzMCkpICMgaW5jcmVhc2Ugc2l6ZSBvZiBtYXJnaW5zDQoNCkVDUF90cmVuZF9wbG90DQpgYGANCg0KRmlndXJlIDEgZXhwbG9yZXMgaWYgdGhlcmUgaXMgbW9udGhseSB2YXJpYXRpb24gaW4gcHJlc2NyaWJpbmcgcmF0ZSBvZiBFQ1AgZm9yIHRoZSB5ZWFycyAyMDE5IHRvIDIwMjIuIEkgaW5jbHVkZWQgNCB5ZWFycyBvZiBjb25zZWN1dGl2ZSBkYXRhIHRvIHNlZSBpZiBhIG9uZS10aW1lIGV2ZW50LCBzdWNoIGFzIHRoZSBDb3ZpZC0xOSBwYW5kZW1pYyBvciB0aGUgQ29tbW9uIFdlYWx0aCBHYW1lcyBhZmZlY3RzIEVDUCBwcmVzY3JpYmluZyByYXRlLiANCg0KRHVlIHRvIGxvdyBwcmVzY3JpYmluZyByYXRlcyBvZiBFQ1AgdGhlcmUgaXMgc3RvY2hhc3RpYyB2YXJpYXRpb24gb24gZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhLiBJbnRlcmVzdGluZyB0cmVuZHMgdG8gbm90ZSBpbmNsdWRlOg0KDQoqIExldm9ub3JnZXN0cmVsIGlzIG1vcmUgY29tbW9ubHkgcHJlc2NyaWJlZCB0aGFuIFVsaXByaXN0YWwgQWNldGF0ZS4gRWFjaCBtb250aCBhbiBhdmVyYWdlIG9mIDE1MCBwcmVzY3JpcHRpb25zIG9mIExldm9ub3JnZXN0cmVsIGFuZCAzIHByZXNjcmlwdGlvbnMgb2YgVWxpcHJpc3RhbCBBY2V0YXRlIGFyZSBkaXNwZW5zZWQgcGVyIDEwMCwwMDAgd29tZW4gYWNyb3NzIFNjb3RsYW5kLiANCg0KKiBUaGUgcHJlc2NyaWJpbmcgcmF0ZSBvZiBMZXZvbm9yZ2VzdHJlbCBoYXMgZGVjcmVhc2VkIGVhY2ggeWVhciBiZXR3ZWVuIDIwMTkgdG8gMjAyMi4gVGhpcyBtYXkgYmUgZHVlIHRvIHB1YmxpYyBoZWFsdGggaW50ZXJ2ZW50aW9ucyB0byBlbmNvdXJhZ2UgdXNlIG9mIGxvbmctYWN0aW5nIHJldmVyc2libGUgY29udHJhY2VwdGlvbiwgcmVkdWNpbmcgdGhlIG5lZWQgZm9yIEVDUC4gQWx0ZXJuYXRpdmVseSB0aGlzIGRlY3JlYXNlIG1heSBiZSBkdWUgdG8gZGlmZmljdWx0aWVzIGluIGFjY2Vzc2luZyBFQ1AgYWZ0ZXIgdGhlIENvdmlkLTE5IHBhbmRlbWljLiANCg0KKiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IGRlY3JlYXNlIGluIHRoZSBwcmVzY3JpcHRpb24gcmF0ZSBvZiBVbGlwcmlzdGFsIEFjZXRhdGUgYmV0d2VlbiAyMDE5IGFuZCBhbGwgY29uc2VjdXRpdmUgeWVhcnMuIFRoaXMgbGlrZWx5IHJlZmxlY3RzIHRoZSBjaGFuZ2UgaW4gcHJlc2NyaXB0aW9uIGd1aWRhbmNlIGluIDIwMjAsIHdoZXJlIHRoZSBFdXJvcGVhbiBNZWRpY2luZXMgQWdlbmN5IHJlY29tbWVuZGVkIHdpdGhkcmF3aW5nIFVsaXByaXN0YWwgQWNldGF0ZSBhcyBhIHRyZWF0bWVudCBmb3IgdXRlcmluZSBmaWJyb2lkcyBkdWUgdG8gc2FmZXR5IGNvbmNlcm5zLiBQcmVzY3JpcHRpb25zIG9mIFVsaXByaXN0YWwgQWNldGF0ZSBmcm9tIDIwMjAgYXJlIHNwZWNpZmljIGZvciBFQ1AuICANCg0KKiBJbiBlYWNoIHllYXIgdGhlcmUgYXJlIHBlYWtzIGluIHRoZSBTdW1tZXIgbW9udGhzIHN1Z2dlc3RpbmcgdGhlcmUgbWF5IGJlIGEgJ1N1bW1lciBvZiBMb3ZlJy4NCg0KKiBCZXR3ZWVuIEZlYnJ1YXJ5IGFuZCBNYXkgb2YgMjAyMCB0aGUgcHJlc2NyaXB0aW9uIHJhdGUgb2YgTGV2b25vcmdlc3RyZWwgZGVjcmVhc2VzIGdyZWF0bHkuIFRoaXMgY29pbmNpZGVzIHdpdGggdGhlIFBoYXNlIDEgQ292aWQtMTkgbG9ja2Rvd24uIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgbmF0aW9uYWwgJ2xvY2tkb3duJyByZWR1Y2VkIG9wcG9ydHVuaXR5IHRvIGVuZ2FnZSBpbiB1bnByb3RlY3RlZCBzZXh1YWwgaW50ZXJjb3Vyc2UuIA0KDQojIyBIb3cgZG9lcyB0aGUgRUNQIHByZXNjcmlwdGlvbiByYXRlIHZhcnkgYnkgSGVhbHRoIEJvYXJkIHJlZ2lvbnMgaW4gU2NvdGxhbmQ/IA0KDQpXcmFuZ2xlIGRhdGEgdG8gZ2V0IHRoZSBjb2x1bW5zIGFuZCB2YWx1ZXMgb2YgaW50ZXJlc3Q6IA0KYGBge3J9DQpFQ1BfYW51YWxfcmF0ZV9kYXRhIDwtIEVDUF9zY3JpcHRzICU+JSANCiAgZ3JvdXBfYnkoaGJfbmFtZSwgZHJ1ZykgJT4lICMgYWdncmVnYXRlIGRhdGEgYnkgSGVhbHRoIEJvYXJkIGFuZCBkcnVnDQogIHN1bW1hcmlzZSh0b3RhbF9xdWFudGl0eV80X3llYXJzID0gc3VtKHBhaWRfcXVhbnRpdHksIG5hLnJtID0gVFJVRSksICMgdG90YWwgcHJlc2NyaXB0aW9ucyBvdmVyIDQgeWVhcnMNCiAgICBhdmdfYW5udWFsX3RvdGFsX3F1YW50aXR5ID0gdG90YWxfcXVhbnRpdHlfNF95ZWFycyAvIDQsICMgYXZlcmFnZSBhbm51YWwgcHJlc2NyaXB0aW9ucw0KICAgIGhiX3BvcHVsYXRpb24gPSBmaXJzdChoYl9wb3B1bGF0aW9uKSwgIyBoYl9wb3B1bGF0aW9uIGlzIGNvbnNpc3RlbnQgd2l0aGluIGVhY2ggaGJfbmFtZQ0KICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSAjIHVuZ3JvdXAgZGF0YQ0KICBkcm9wX25hKGRydWcpICU+JSAjIHJlbW92ZSByb3dzIHdpdGggbm8gZHJ1ZyB2YWx1ZXMNCiAgbXV0YXRlKGF2Z19hbm51YWxfcHJlc2NfMTAwMDAwID0gYXZnX2FubnVhbF90b3RhbF9xdWFudGl0eSAqIDEwMDAwMCAvIGhiX3BvcHVsYXRpb24pICU+JSAjIGF2ZXJhZ2UgYW5udWFsIHJhdGUgb2YgcHJlc2NyaXB0aW9ucyBwZXIgMTAwLDAwMA0KICBzZWxlY3QoaGJfbmFtZSwgZHJ1ZywgYXZnX2FubnVhbF9wcmVzY18xMDAwMDAsIGhiX3BvcHVsYXRpb24pICU+JSAjIHNlbGVjdCBjb2x1bW5zIG9mIGludGVyZXN0IGJlZm9yZSBwaXZvdA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZHJ1ZywgdmFsdWVzX2Zyb20gPSBhdmdfYW5udWFsX3ByZXNjXzEwMDAwMCwgbmFtZXNfZ2x1ZSA9ICJ7ZHJ1Z31fcmF0ZSIpICU+JSAjIFJlbmFtZSBjb2x1bW5zIGZvciBjbGFyaXR5DQogIGNsZWFuX25hbWVzKCkgIyBjbGVhbiBjb2x1bW4gbmFtZXMgZm9sbG93aW5nIHBpdm90DQoNCiMgY2FsY3VsYXRlIHRvdGFsIEVDUCBwcmVzY3JpcHRpb24gcmF0ZSBwZXIgaGVhbHRoIGJvYXJkDQpFQ1BfYW51YWxfcmF0ZV9kYXRhIDwtIEVDUF9hbnVhbF9yYXRlX2RhdGEgJT4lIA0KICBtdXRhdGUodG90YWxfRUNQX3JhdGUgPSByb3dTdW1zKHNlbGVjdCguLCBsZXZvbm9yZ2VzdHJlbF9yYXRlLCB1bGlwcmlzdGFsX2FjZXRhdGVfcmF0ZSksIG5hLnJtID0gVFJVRSkpICU+JSAgI3N1bSByYXRlcyANCiAgYXJyYW5nZShkZXNjKHRvdGFsX0VDUF9yYXRlKSkgIyBhcnJhbmdlIGJ5IHRvdGFsIHJhdGUgaW4gZGVzY2VuZGluZyBvcmRlcg0KDQojY2FsY3VsYXRlIHBlcmNlbnRhZ2UgeW91bmcgcGVvcGxlIHBlciBoZWFsdGggYm9hcmQgdG8gZXhwbG9yZSBpZiB0aGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBoZXJlIA0KRUNQX2FudWFsX3JhdGVfZGF0YV95b3VuZyA8LSBFQ1BfYW51YWxfcmF0ZV9kYXRhICU+JSANCiAgZnVsbF9qb2luKHlvdW5nX3BvcHVsYXRpb25fZGF0YSkgJT4lICMgdG8gZ2V0IHRoZSBwb3B1bGF0aW9uIG9mIHRob3NlIGFnZWQgMTYtMzQgeWVhcnMgDQogIGdyb3VwX2J5KGhiX25hbWUpICU+JSANCiAgbXV0YXRlKHByb3BfeW91bmdfcHBsX2hiID0gcG9wX2hiXzE2XzM0L2hiX3BvcHVsYXRpb24pICU+JSAjIGNhbGN1bGF0ZSBwcm9wb3J0aW9uIG9mIHlvdW5nIHBlb3BsZSBpbiBlYWNoIGhlYWx0aCBib2FyZCANCiAgdW5ncm91cCgpDQpgYGANCg0KUGxvdCB0YWJsZSAxOg0KYGBge3IgYW5udWFsX3RhYmxlLCBmaWcuY2FwPSgiVGFibGUgMTogQXZlcmFnZSBBbm51YWwgUmF0ZSBvZiBFbWVyZ2VuY3kgQ29udHJhY2VwdGlvbiBQcmVzY3JpcHRpb25zIGJ5IEhlYWx0aCBCb2FyZCBSZWdpb24gaW4gU2NvdGxhbmQuIil9DQphbm51YWxfYXZnX0VDUF90YWJsZSA8LSBFQ1BfYW51YWxfcmF0ZV9kYXRhX3lvdW5nICU+JSANCiAgc2VsZWN0KGhiX25hbWUsIGxldm9ub3JnZXN0cmVsX3JhdGUsIHVsaXByaXN0YWxfYWNldGF0ZV9yYXRlLCB0b3RhbF9FQ1BfcmF0ZSxwcm9wX3lvdW5nX3BwbF9oYikgJT4lICMgU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMNCiAgZ3QoKSAlPiUgDQogIGNvbHNfbGFiZWwoaGJfbmFtZSA9ICJIZWFsdGggQm9hcmQiLA0KICAgICAgICAgICAgIHRvdGFsX0VDUF9yYXRlPSAiVG90YWwiLA0KICAgICAgICAgICAgIGxldm9ub3JnZXN0cmVsX3JhdGU9ICIgTGV2b25vcmdlc3RyZWwiLA0KICAgICAgICAgICAgIHVsaXByaXN0YWxfYWNldGF0ZV9yYXRlPSIgVWxpcHJpc3RhbCBBY2V0YXRlIiwNCiAgICAgICAgICAgICBwcm9wX3lvdW5nX3BwbF9oYiA9ICIlIEFnZWQgMTYtMzQgWWVhcnMiKSAlPiUgIyByZW5hbWUgY29sdW1ucyB0byBtYWtlIHJlYWRlci1mcmllbmRseQ0KICBmbXRfbnVtYmVyKGNvbHVtbnMgPSBjKGxldm9ub3JnZXN0cmVsX3JhdGUsIHVsaXByaXN0YWxfYWNldGF0ZV9yYXRlLCB0b3RhbF9FQ1BfcmF0ZSwgcHJvcF95b3VuZ19wcGxfaGIpLCBkZWNpbWFscyA9IDApICU+JSAjIG5vIGRlY2ltYWwgcG9pbnRzIGFzIGZhbHNlIGFjY3VyYWN5IGRldHJhY3RzIGZyb20gdGhlIG1lc3NhZ2UgaW4gdGhlIGRhdGENCiAgY29sc19hbGlnbihhbGlnbiA9ICJjZW50ZXIiLCBjb2x1bW5zID0gYyhsZXZvbm9yZ2VzdHJlbF9yYXRlLHVsaXByaXN0YWxfYWNldGF0ZV9yYXRlLHRvdGFsX0VDUF9yYXRlLCBwcm9wX3lvdW5nX3BwbF9oYikpICU+JSAgIyBjZW50cmUgY29sdW1uIG5hbWVzDQogIGdyYW5kX3N1bW1hcnlfcm93cyhjb2x1bW5zID0gYyhsZXZvbm9yZ2VzdHJlbF9yYXRlLHVsaXByaXN0YWxfYWNldGF0ZV9yYXRlLCB0b3RhbF9FQ1BfcmF0ZSksIGZucyA9IGxpc3QoIk92ZXJhbGwgQXZlcmFnZSIgPSB+bWVhbiguLCBuYS5ybSA9IFRSVUUpKSwgZm10ID0gbGlzdCh+IGZtdF9udW1iZXIoLiwgZGVjaW1hbHMgPSAwKSkpICU+JSAjIGFkZCBhbiBvdmVyYWxsIGF2ZXJhZ2UgZm9yIHRoZSByYXRlIGNvbHVtbnMNCiAgZm10X3BlcmNlbnQoY29sdW1ucyA9IHByb3BfeW91bmdfcHBsX2hiLCBkZWNpbWFscyA9IDApICU+JSAgIyBhZGQgcGVyY2VudGFnZSBzaWduDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipBdmVyYWdlIEFubnVhbCBSYXRlIG9mIEVtZXJnZW5jeSBDb250cmFjZXB0aW9uIFByZXNjcmlwdGlvbnMgYnkgSGVhbHRoIEJvYXJkIGluIFNjb3RsYW5kLioqIiksDQogICAgICAgICAgICAgc3VidGl0bGUgPSBtZCgiUmF0ZSBwZXIgMTAwLDAwMCB3b21lbiwgZGVyaXZlZCBmcm9tIHRoZSBtZWFuIHByZXNjcmlwdGlvbiByYXRlcyBhY3Jvc3MgdGhlIHllYXJzIDIwMTkgdG8gMjAyMi4gSGVhbHRoIEJvYXJkcyBhcmUgcmFua2VkIGluIGRlc2NlbmRpbmcgb3JkZXIuIikpICU+JSAjIGFkZCBhIHRpdGxlIGFuZCBzdWJ0aXRsZTsgbWQoKSBhbGxvd3MgdGV4dCBmb3JtYXR0aW5nIGZyb20gbWFyayBkb3duIA0KICB0YWJfc3Bhbm5lcihsYWJlbCA9IG1kKCIqUHJlc2NyaXB0aW9uIHJhdGUgcGVyIDEwMCwwMDAgd29tZW4qIiksIGNvbHVtbnMgPSBjKGxldm9ub3JnZXN0cmVsX3JhdGUsdWxpcHJpc3RhbF9hY2V0YXRlX3JhdGUsIHRvdGFsX0VDUF9yYXRlKSkgJT4lICMgYWRkIGEgdGl0bGUgdG8gdGhlIHJhdGUgY29sdW1ucy4NCiAgdGFiX3NvdXJjZV9ub3RlKG1kKCIqRGF0YSBmcm9tIFB1YmxpYyBIZWFsdGggU2NvdGxhbmQuIEF2YWlsYWJsZSBmcm9tOiAoaHR0cHM6Ly93d3cub3BlbmRhdGEubmhzLnNjb3QvZGF0YXNldC9wcmVzY3JpcHRpb25zLWluLXRoZS1jb21tdW5pdHkpKiIpKSAlPiUgDQogIHRhYl9zdHViaGVhZChtZCgiKioyMDE5LTIwMjIqKiIpKSAlPiUgDQogIHRhYl9mb290bm90ZShmb290bm90ZSA9ICJpbmNsdWRlcyBDYXBpdGFsIENpdHksIEVkaW5idXJnaCIsIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGhiX25hbWUsIHJvd3MgPSAyKSklPiUgDQogIG9wdF9zdHlsaXplKHN0eWxlID0gNiwgY29sb3IgPSAiYmx1ZSIpDQoNCmFubnVhbF9hdmdfRUNQX3RhYmxlDQpgYGANCg0KVGFibGUgMSBzaG93cyB0aGF0IE5IUyBHcmVhdGVyIEdsYXNnb3cgYW5kIENseWRlLCBhbmQgTkhTIExvdGhpYW4gaGF2ZSB0aGUgaGlnaGVzdCBhbm51YWwgRUNQIHByZXNjcmlwdGlvbiByYXRlLiBJbnRlcmVzdGluZ2x5IHRoZXNlIEhlYWx0aCBCb2FyZCByZWdpb25zIGNvbnRhaW4gdGhlIG1ham9yIFNjb3R0aXNoIGNpdGllcywgR2xhc2dvdyBhbmQgRWRpbmJ1cmdoLiANCg0KR2VuZXJhbGx5IHRoZSBoZWFsdGggYm9hcmRzIHdpdGggdGhlIGhpZ2hlc3QgYW5udWFsIEVDUCBwcmVzY3JpcHRpb24gcmF0ZSBhbHNvIGhhZCB0aGUgaGlnaGVzdCBwcm9wb3J0aW9uIG9mIHlvdW5nIHBlb3BsZSBsaXZpbmcgaW4gdGhlaXIgaGVhbHRoIGJvYXJkIHJlZ2lvbi4gVGhpcyBtYXkgc3VnZ2VzdCB0aGF0IHlvdW5nIHBlb3BsZSBhZ2VkIDE2IHRvIDM0IHllYXJzIGFyZSBtb3JlIGxpa2VseSB0byByZXF1aXJlIGVtZXJnZW5jeSBjb250cmFjZXB0aW9uLg0KDQpOSFMgQXlyc2hpcmUgYW5kIEFycmFuIGlzIGFuIG91dGxpZXIgdG8gdGhpcyB0cmVuZCBoYXZpbmcgdGhlIHRoaXJkIGhpZ2hlc3QgRUNQIHByZXNjcmlwdGlvbiByYXRlLCBhbmQgeWV0IGEgcmVsYXRpdmVseSBzbWFsbGVyIHByb3BvcnRpb24gb2YgeW91bmcgcGVvcGxlIGxpdmluZyBpbiB0aGlzIGhlYWx0aCBib2FyZCAoMTklKS4gVGhpcyBuZWVkcyBmdXJ0aGVyIGV4cGxvcmF0aW9uLCBwZXJoYXBzIGluZGljYXRpbmcgdGhhdCB1bmRlciAxNnMgb3Igb3ZlciAzNXMgYXJlIHVzaW5nIHRoZSBFQ1Agc2VydmljZXMgbW9yZSBpbiB0aGlzIHJlZ2lvbi4gDQoNCk1vcmUgcmVtb3RlIGFuZCBydXJhbCBIZWFsdGggQm9hcmRzIHN1Y2ggYXMgTkhTIEhpZ2hsYW5kIGFuZCBOSFMgQm9yZGVycyBoYWQgdGhlIGxvd2VzdCByYXRlIG9mIEVDUCBwcmVzY3JpYmluZy4gVGhleSBhbHNvIGhhZCBhIHNtYWxsZXIgcHJvcG9ydGlvbiBvZiB5b3VuZyBwZW9wbGUgbGl2aW5nIGluIHRoZWlyIGhlYWx0aCBib2FyZC4NCg0KV2hlbiBjb21wYXJpbmcgdGhlIHR5cGUgb2YgRUNQIHByZXNjcmliZWQgdGFibGUgMSBzaG93cyB0aGF0IGxldm9ub3JnZXN0cmVsIGlzIG1vcmUgY29tbW9ubHkgcHJlc2NyaWJlZCB0aGFuIFVsaXByaXN0YWwgQWNldGF0ZS4gSG93ZXZlciB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiB0aGUgTkhTIFdlc3Rlcm4gSXNsZXMgSGVhbHRoIEJvYXJkLCB3aGVyZSBhIHNpbWlsYXIgcHJvcG9ydGlvbiBvZiBMZXZvbm9yZ2VzdHJlbCBpcyBwcmVzY3JpYmVkIHRvIFVsaXByaXN0YWwgQWNldGF0ZS4gVGhpcyBwZXJoYXBzIGhpZ2hsaWdodHMgZGlzcGFyaXR5IGluIHRoZSBwcmVzY3JpYmluZyBwcmFjdGljZXMgYnkgaGVhbHRoIGJvYXJkIHJlZ2lvbi4gVGhpcyBpcyBleHBsb3JlZCBmdXJ0aGVyIGluIGZpZ3VyZSAzLg0KDQojIyBBcmUgcGhhcm1hY2llcyBpbiBtb3JlIGRlcHJpdmVkIGFyZWFzIHByZXNjcmliaW5nIG1vcmUgRUNQIHRoYW4gdGhvc2UgaW4gYWZmbHVlbnQgYXJlYXM/DQoNClJlYWQgaW4gYW5kIHdyYW5nbGUgZGF0YToNCmBgYHtyfQ0KIyBUbyBtZWFzdXJlIGRlcHJpdmF0aW9uIEkgaGF2ZSB1c2VkIHRoZSBTY290dGlzaCBJbmRleCBvZiBNdWx0aXBsZSBEZXByaXZhdGlvbi4gMjAyMHYyIGRhdGFzZXQgZnJvbSBQdWJsaWMgSGVhbHRoIFNjb3RsYW5kLiAobGluayBhdmFpbGFibGUgaW4gY29kZSkNClNJTUQgPC0gcmVhZF9jc3YoImh0dHBzOi8vd3d3Lm9wZW5kYXRhLm5ocy5zY290L2dsL2RhdGFzZXQvNzhkNDFmYTktMWE2Mi00ZjdiLTllZGItM2U4NTIyYTkzMzc4L3Jlc291cmNlL2FjYWRlMzk2LTg0MzAtNGIzNC04OTVhLWIzZTc1N2ZhMzQ2ZS9kb3dubG9hZC9zaW1kMjAyMHYyXzIyMDYyMDIwLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpICU+JQ0KICBzZWxlY3QoZGF0YV96b25lLCBzaW1kMjAyMHYyaGJfZGVjaWxlKQ0KDQojIEkgY2hvc2UgdG8gdXNlIEdQIFByYWN0aWNlcyBhbmQgTGlzdCBTaXplcyBmcm9tIE9jdG9iZXIgMjAyMiwgYXMgdGhpcyB3YXMgdGhlIGNsb3Nlc3QgZGF0YXNldCBJIGNvdWxkIGZpbmQgd2hpY2ggY29ycmVsYXRlZCB3aXRoIHRoZSBmaW5hbCB5ZWFyIG9mIG15IHByZXNjcmlwdGlvbnMgZGF0YXNldDoNCmdwX2FkZHJlc3NlcyA8LSByZWFkX2NzdigiaHR0cHM6Ly93d3cub3BlbmRhdGEubmhzLnNjb3QvZGF0YXNldC9mMjM2NTVjMy02ZTIzLTQxMDMtYTUxMS1hODBkOTk4YWRiOTAvcmVzb3VyY2UvMWExNWNiMzQtZmNmOS00ZDNmLWFkNjMtMWJhM2U2NzVmYmUyL2Rvd25sb2FkL3ByYWN0aWNlX2NvbnRhY3RkZXRhaWxzX29jdDIwMjItb3Blbi1kYXRhLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpICU+JQ0KICBzZWxlY3QocHJhY3RpY2VfY29kZSwgZ3BfcHJhY3RpY2VfbmFtZSwgZGF0YV96b25lKQ0KDQojIENyZWF0ZSBFQ1BfR1AgYnkgdXNpbmcgdGhlIEdQX2FkZHJlc3NlcyBkYXRhc2V0IHRvIG1hcCB0aGUgR1AgcHJhY3RpY2UgY29kZSB0byBhIGRhdGF6b25lLiBJIHRoZW4gdXNlZCB0aGUgY29sdW1uIGRhdGF6b25lIHRvIGZ1bGxfam9pbigpIHRoZSBTSU1EIGRhdGFzZXQgdG8gdGhlIHByZXNjcmlwdGlvbnMgZGF0YXNldC4NCkVDUF9HUCA8LSBFQ1Bfc2NyaXB0cyAlPiUNCiAgZmlsdGVyKCFncF9wcmFjdGljZSAlaW4lIGMoOTk5OTYsIDk5OTk3LCA5OTk5OCkpICU+JSAjIHJlbW92ZSBkdW1teSBHUCBwcmFjdGljZSBjb2RlcyBhcyB0aGV5IGRvIG5vdCBoYXZlIGEga25vd24gZ3AgcHJhY3RpY2UgY29kZSBzbyBjYW5ub3QgYmUgbWFwcGVkIHRvIGEgU0lNRC4NCiAgbGVmdF9qb2luKGdwX2FkZHJlc3NlcywgYnkgPSBjKCJncF9wcmFjdGljZSIgPSAicHJhY3RpY2VfY29kZSIpKSAlPiUNCiAgI2xlZnRfam9pbihkYXRhX3pvbmVzLCBieSA9ICJkYXRhX3pvbmUiKSAlPiUNCiAgbGVmdF9qb2luKFNJTUQsIGJ5ID0gImRhdGFfem9uZSIpICU+JQ0KICBkcm9wX25hKHNpbWQyMDIwdjJoYl9kZWNpbGUpICU+JSAjIG5lZWQgU0lNRCB2YWx1ZSB0byBmb3IgcGxvdA0KICBncm91cF9ieShncF9wcmFjdGljZSkgJT4lIA0KICBtdXRhdGUodG90YWxfcXVhbnRpdHlfcGVyX2dwID0gc3VtKHBhaWRfcXVhbnRpdHkpKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCg0KIyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBHUHMgcGVyIFNJTUQgKGFjY291bnQgZm9yIGVhY2ggU0lNRCBoYXZpbmcgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIEdQcykgDQp0b2FsX25vX0dQX3Blcl9TSU1EIDwtIEVDUF9HUCAlPiUgDQogIGdyb3VwX2J5KHNpbWQyMDIwdjJoYl9kZWNpbGUpICU+JQ0KICBtdXRhdGUodW5pcXVlX2dwX2NvdW50X3Blcl9TSU1EID0gbl9kaXN0aW5jdChncF9wcmFjdGljZSkpDQpgYGANCg0KUGxvdCBmaWd1cmUgMjoNCmBgYHtyIFNJTURfZmlndXJlLCBmaWcuY2FwPSgiRmlndXJlIDI6IEludGVyYWN0aXZlIEJhcmNoYXJ0IHNob3dpbmcgRW1lcmdlbmN5IENvbnRyYWNlcHRpb24gUHJlc2NyaXB0aW9ucyBieSBTY290dGlzaCBJbmRleCBvZiBNdWx0aXBsZSBEZXByaXZhdGlvbiAoU0lNRCkuIil9DQpFQ1BfU0lNRF9iYXJjaGFydCA8LSB0b2FsX25vX0dQX3Blcl9TSU1EICU+JQ0KICBncm91cF9ieShzaW1kMjAyMHYyaGJfZGVjaWxlLCBkcnVnKSAlPiUgDQogIHN1bW1hcmlzZShwcmVzY3JpcHRpb25zX2dwID0gKHRvdGFsX3F1YW50aXR5X3Blcl9ncCAvIHVuaXF1ZV9ncF9jb3VudF9wZXJfU0lNRCksICMgY2FsY3VsYXRlIHRoZSBwcmVzY3JpcHRpb25zIHBlciBHUCBmb3IgZWFjaCBTSU1EIGRlY2lsZSBhbmQgZHJ1Zw0KICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSAgIyBVbmdyb3VwIGRhdGEgYWZ0ZXIgc3VtbWFyaXNhdGlvbg0KICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3Ioc2ltZDIwMjB2MmhiX2RlY2lsZSwgbGV2ZWxzID0gMToxMCkseSA9IHByZXNjcmlwdGlvbnNfZ3AsICBmaWxsID0gZHJ1ZywgdGV4dCA9IHBhc3RlKCJEZWNpbGU6Iiwgc2ltZDIwMjB2MmhiX2RlY2lsZSwgIjxicj5EcnVnOiIsIGRydWcpKSkgKyAjIGN1c3RvbWlzZSBob3ZlciBib3ggZm9yIGludGVyYWN0aXZlIGNoYXJ0DQogIGdlb21fY29sKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNDU3NWI0IiwgIiM5MWJmZGIiKSwgbmFtZSA9ICJEcnVnIFR5cGUiKSArICAjIGFkZCBjb2xvdXIgcGFsZXR0ZQ0KICBsYWJzKHRpdGxlID0gIkVtZXJnZW5jeSBDb250cmFjZXB0aW9uIFByZXNjcmlwdGlvbnMgYnkgXG4gU2NvdHRpc2ggSW5kZXggb2YgTXVsdGlwbGUgRGVwcml2YXRpb24gKFNJTUQpIDIwMTkgdG8gMjAyMiwgXG4gbm9ybWFsaXNlZCBieSBudW1iZXIgb2YgR1BzIHBlciBTSU1EIGRlY2lsZS4iLA0KICAgIHggPSAiU0lNRCBEZWNpbGUgXG4gKDEgPSBNb3N0IERlcHJpdmVkLCAxMCA9IExlYXN0IERlcHJpdmVkKSIsDQogICAgeSA9ICJUb3RhbCBQcmVzY3JpcHRpb25zIiwNCiAgICBmaWxsID0gIkRydWciKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAxKSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkNCg0KRUNQX1NJTURfYmFyY2hhcnQgPC0gZ2dwbG90bHkoRUNQX1NJTURfYmFyY2hhcnQsIHRvb2x0aXAgPSAidGV4dCIpICMgbWFrZSBwbG90IGludGVyYWN0aXZlDQpFQ1BfU0lNRF9iYXJjaGFydA0KYGBgDQoNCkdlbmVyYWxseSBhcyBTSU1EIGRlY2lsZSBpbmNyZWFzZXMgdGhlIG51bWJlciBvZiBwcmVzY3JpcHRpb25zIG9mIEVDUCBkZWNyZWFzZXMuIEdQcyBpbiBTSU1EMSwgdGhlIG1vc3QgZGVwcml2ZWQgYXJlYXMsIHByZXNjcmliZSB0aGUgbW9zdCBFQ1Agd2hpbHN0IGluY3JlYXNpbmcgYWZmbHVlbmNlIGlzIHJlbGF0ZWQgdG8gZGVjcmVhc2luZyBudW1iZXIgb2YgRUNQIHByZXNjcmliZWQuIFRoaXMgc3VnZ2VzdHMgdGhvc2UgaW4gZGVwcml2ZWQgYXJlYXMgYXJlIHV0aWxpc2luZyBFQ1AgbW9yZSwgaGlnaGxpZ2h0aW5nIGFuIGluZXF1YWxpdHkgaW4gaGVhbHRoIG5lZWQuIFBlcmhhcHMgdGhpcyBkaXNwYXJpdHkgaXMgZHVlIHRvIGVkdWNhdGlvbiwgc2FmZSBwcmFjdGljZXMsIGVudmlyb25tZW50YWwgZmFjdG9ycywgYWNjZXNzIHRvIGxvbmcgYWN0aW5nLXJldmVyc2libGUgY29udHJhY2VwdGlvbi4gDQoNCiMjIElzIHRoZXJlIGdlb2dyYXBoaWNhbCB2YXJpYXRpb24gaW4gdGhlIHByZXNjcmliaW5nIHByYWN0aWNlcyBvZiBFQ1AgYnkgSGVhbHRoIEJvYXJkIHJlZ2lvbj8NCg0KSSB3YW50ZWQgdG8gZXhwbG9yZSBpZiB0aGVyZSB3YXMgYW55IGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHR5cGUgb2YgY29udHJhY2VwdGlvbiBiZWluZyBwcmVzY3JpYmVkIGFuZCB0aGUgbG9jYXRpb24gb2YgdGhlIHBoYXJtYWN5LiBUbyBkbyB0aGlzIEkgY2FsY3VsYXRlZCB0aGUgcmF0aW8gb2YgdG90YWwgbGV2b25vcmdlc3RyZWwgcHJlc2NyaXB0aW9ucyB0byB0b3RhbCBlbWVyZ2VuY3kgY29udHJhY2VwdGlvbiBwcmVzY3JpcHRpb25zIGZvciBlYWNoIEhlYWx0aCBCb2FyZCBSZWdpb24uDQoNCiQkDQpcZnJhY3tMZXZvbm9yZ2VzdHJlbH17TGV2b25vcmdlc3RyZWwgKyBVbGlwcmlzdGFsIEFjZXRhdGV9DQokJA0KDQpBIHNjb3JlIGNsb3NlIHRvIG9uZSBzdWdnZXN0IHRoZSBtYWpvcml0eSBvZiBwcmVzY3JpcHRpb25zIGluIHRoaXMgcmVnaW9uIGFyZSBMZXZvbm9yZ2VzdHJlbCwgd2hpbHN0IGEgc2NvcmUgY2xvc2VyIHRvIHplcm8gaW5kaWNhdGVzIHRoZSBtYWpvcml0eSBvZiBwcmVzY3JpcHRpb25zIGFyZSBVbGlwcmlzdGFsIEFjZXRhdGUuIFRoaXMgaXMgYSB1c2VmdWwgd2F5IG9mIGlkZW50aWZ5aW5nIHZhcmlhdGlvbiBpbiBwcmVzY3JpYmluZyBwcmFjdGljZXMuIA0KDQpGaWd1cmUgMzoNCmBgYHtyIGdlb2dfZmlndXJlLCBmaWcuY2FwPSAoIkZpZ3VyZSAzOiBIZWF0bWFwIGV4cGxvcmluZyBnZW9ncmFwaGljYWwgdmFyaWF0aW9uIGluIEVtZXJnZW5jeSBDb250cmFjZXB0aW9uIFBpbGwgcHJlc2NyaWJpbmciKX0NCiMgbG9hZCB0aGUgTkhTIEhlYWx0aCBib2FyZCBTaGFwZWZpbGUgZG93bmxvYWRlZCBmcm9tIGxlYXJuIHBhZ2UNCk5IU19oZWFsdGhib2FyZHMgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgIk5IU19oZWFsdGhib2FyZHNfMjAxOS5zaHAiKSkgJT4lIA0KICBtdXRhdGUoSEJOYW1lID0gcGFzdGUoIk5IUyIsIEhCTmFtZSkpICU+JSAjIGZvcm1hdCB0byBtYXRjaCBFQ1Bfc2NyaXB0cyBkYXRhc2V0DQogIGNsZWFuX25hbWVzKCkNCg0KIyBjYWxjdWxhdGUgdGhlIHJhdGlvIG9mIExldiB0byBVbGkgcHJlc2NyaWJlZCANCnZhcmlhdGlvbl9FQ1BfcHJlc2NyaWJlZCA8LSBFQ1Bfc2NyaXB0cyAlPiUgDQogIGdyb3VwX2J5KGhiX25hbWUsZHJ1ZykgJT4lIA0KICAjIGNhbGN1bGF0ZSB0aGUgdG90YWwgb2YgTGV2IGFuZCBVbGkgcHJlc2NyaWJlZCBwZXIgaGVhbHRoIGJvYXJkDQogIHN1bW1hcmlzZSh0b3RhbF9lYWNoX2RydWdfdHlwZSA9IHN1bShwYWlkX3F1YW50aXR5LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZHJvcF9uYShkcnVnKSAlPiUgDQogICNwaXZvdF93aWRlciB0byBtb3ZlIGRydWcgbmFtZXMgdG8gY29sdW1ucyANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRydWcsIHZhbHVlc19mcm9tID0gdG90YWxfZWFjaF9kcnVnX3R5cGUpICU+JQ0KICBjbGVhbl9uYW1lcygpICU+JSAjIGNvbnNpc3RlbmN5IA0KICBtdXRhdGUobGV2b190b191bGlfcmF0aW8gPSBsZXZvbm9yZ2VzdHJlbCAvIChsZXZvbm9yZ2VzdHJlbCArIHVsaXByaXN0YWxfYWNldGF0ZSkpICMgY2FsY3VsYXRlIHJhdGlvIA0KDQojIEpvaW4gc3BhdGlhbCBkYXRhIHdpdGggdmFyaWF0aW9uX0VDUF9wcmVzY3JpYmVkDQp2YXJpYXRpb25fRUNQX3ByZXNjcmliZWQgPC0gTkhTX2hlYWx0aGJvYXJkcyAlPiUNCiAgbGVmdF9qb2luKHZhcmlhdGlvbl9FQ1BfcHJlc2NyaWJlZCkNCg0KI0NyZWF0ZSBtYXAgaW4gZ2dwbG90DQptYXBfdmFyaWF0aW9uX0VDUF9wcmVzY3JpYmVkIDwtIHZhcmlhdGlvbl9FQ1BfcHJlc2NyaWJlZCAlPiUNCiAgZ2dwbG90KGFlcyhmaWxsID0gbGV2b190b191bGlfcmF0aW8pKSArDQogIGdlb21fc2Yoc2l6ZSA9IDAuMSwgY29sb3VyID0gImdyZXk1MCIsIGFscGhhID0wLjkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJCbHVlcyIsIGRpcmVjdGlvbiA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJHZW9ncmFwaGljYWwgdmFyaWF0aW9uIGluIEVtZXJnZW5jeSBDb250cmFjZXB0aXZlIFxuIFBpbGwgcHJlc2NyaWJpbmcgaW4gU2NvdGxhbmQuIiwgDQogICAgICAgc3VidGl0bGUgPSAiSGVhdG1hcCBzaG93aW5nIExldm9ub3JnZXN0cmVsIHByZXNjcmlwdGlvbnMgYXMgYSBwcm9wb3J0aW9uIG9mIHRvdGFsIFxuIEVtZXJnZW5jeSBDb250cmFjZXB0aXZlIFBpbGwgKEVDUCkgcHJlc2NyaXB0aW9ucyBieSBIZWFsdGggQm9hcmQgcmVnaW9uIiwgDQogICAgICAgZmlsbCA9ICJMZXZvbm9yZ2VzdHJlbCB0byBFQ1AgcmF0aW8iLCBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBQdWJsaWMgSGVhbHRoIFNjb3RsYW5kIFByZXNjcmlwdGlvbnMgaW4gdGhlIENvbW11bml0eSwgMjAxOS0yMDIyIikgKw0KICBjb29yZF9zZigpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTgsIGhqdXN0PTAuNSksIA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBoanVzdD0wLjUpLCANCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgaGp1c3Q9MC41KSwNCiAgICBsZWdlbmQuZGlyZWN0aW9uID0gInZlcnRpY2FsIiwNCiAgICBsZWdlbmQuYm94ID0gImhvcml6b250YWwiKSArDQogIGFubm90YXRpb25fc2NhbGUobG9jYXRpb24gPSAidGwiKSArDQogIGFubm90YXRpb25fbm9ydGhfYXJyb3coDQogICAgbG9jYXRpb24gPSAidGwiLCAgICANCiAgICBwYWRfeSA9IHVuaXQoMC41LCAiaW4iKSwgICAgDQogICAgc3R5bGUgPSBub3J0aF9hcnJvd19uYXV0aWNhbChmaWxsID0gYygiZ3JleTQwIiwgIndoaXRlIiksbGluZV9jb2wgPSAiZ3JleTIwIikpDQoNCm1hcF92YXJpYXRpb25fRUNQX3ByZXNjcmliZWQNCmBgYA0KDQpIZWFsdGggQm9hcmQgUmVnaW9ucyBpbiBjZW50cmFsIFNjb3RsYW5kIHByZWRvbWluYW50bHkgcHJlc2NyaWJlIExldm9ub3JnZXN0cmVsLiBNb3JlIHJlbW90ZSBhbmQgcnVyYWwgSGVhbHRoIEJvYXJkIHJlZ2lvbnMgc3VjaCBhcyB0aGUgTkhTIFdlc3Rlcm4gSXNsZXMgYXBwZWFyIHRvIHByZXNjcmliZSBtb3JlIFVsaXByaXN0YWwgQWNldGF0ZS4gVGhpcyBkaWZmZXJlbmNlIGluIHByZXNjcmliaW5nIHByYWN0aWNlIG1heSBoaWdobGlnaHQgYSBkaXNwYXJpdHkgaW4gYWJpbGl0eSB0byBxdWlja2x5IGFjY2VzcyBlbWVyZ2VuY3kgY29udHJhY2VwdGlvbiBpbiByZW1vdGUgYW5kIHJ1cmFsIHJlZ2lvbnMuIFBhdGllbnRzIG1heSBwcmVzZW50IGxhdGVyIHRvIGhlYWx0aCBzZXJ2aWNlcyBsYXRlciwgbWVhbmluZyBwcmVzY3JpYmVycyBkaXNwZW5zZSBVbGlwcmlzdGFsIEFjZXRhdGUgd2hpY2ggaGFzIHRoZSBsb25nZXIgdGltZSBmcmFtZSBvZiA1IGRheS4gQWx0ZXJuYXRpdmVseSB0aGlzIHZhcmlhdGlvbiBpbiBwcmVzY3JpYmluZyBwcmFjdGlzZSBtYXkgYmUgZHVlIHRvIGRpZmZlcmVuY2VzIGluIHByZXNjcmliZXIgcHJlZmVyZW5jZXMgaW4gbW9yZSByZW1vdGUgYXJlYXMuDQoNCiMgQ29uY2x1c2lvbiANCg0KUHJlc2NyaXB0aW9ucyBvZiBFQ1AgYXJlIGRlY3JlYXNpbmcgb3ZlciB0aGUgeWVhcnMuIER1cmluZyAyMDIwIHRoZXJlIHdhcyBhIHNpZ25pZmljYW50IHJlZHVjdGlvbiBpbiBwcmVzY3JpcHRpb24gb2YgTGV2b25vcmdlc3RyZWwgbGlrZWx5IGR1ZSB0byBDb3ZpZC0xOSBsb2NrZG93bi4gV2hlbiBsb29raW5nIGF0IFVsaXByaXN0YWwgQWNldGF0ZSBhIGNsZWFyIHJlZHVjdGlvbiBmcm9tIDIwMTkgdG8gMjAyMCBvbndhcmRzIHJlZmxlY3RzIGNoYW5nZSBpbiBwcmVzY3JpYmluZyBndWlkYW5jZSwgbm8gbG9uZ2VyIHByZXNjcmliZWQgZm9yIHV0ZXJpbmUgZmlicm9pZHMuIA0KDQpIZWFsdGggQm9hcmQgcmVnaW9ucyB3aXRoIG1vcmUgeW91bmcgcGVvcGxlIGFuZCBiaWcgY2l0aWVzIGhhZCBhIGhpZ2hlciByYXRlIG9mIEVDUCBwcmVjcmlwdGlvbnMuIEF5ciBhbmQgQXJyYW4gd2FzIGEgc2xpZ2h0IG91dGxpZXIgdG8gdGhpcyBwYXR0ZXJuIGhhdmluZyBhIHNsaWdodGx5IHJlZHVjZWQgWVAgcG9wdWxhdGlvbiBhbmQgeWV0IGhpZ2ggcHJldmVsYW5jZSBvZiBFQ1AgcHJlc2NyaXB0aW9uLiBJbnRlcmVzdGluZyB0byBleHBsb3JlIHRoaXMgZnVydGhlci4gDQoNCk1vcmUgRUNQcyB3ZXJlIHBlcnNjcmliZWQgd2l0aCBpbmNyZWFzaW5nIGRlcHJpdmF0aW9uLiANCg0KR2VvZ3JhcGhpY2x5IC0gbW9yZSByZW1vdGUgcGhhcm1hY2llcyBhcHBlYXJlZCB0byBwcmVzY3JpYmUgaGlnaGVyIGFtb3VudHMgb2YgVWxpcHJpc3RhbCBBY2V0YXRlLiBJcyB0aGlzIGR1ZSB0byBjaGFsbGVuZ2VzIGluIGFjY2Vzc2luZyBwaGFybWFjeSB3aXRoaW4gNDggaG91cnMgb2YgdW5wcm90ZWN0ZWQgc2V4LCANCg0KSW4gY29uY2x1c2lvbiBwcmVzY3JpYmluZyBwYXR0ZXJucyBvZiBFQ1AgYXJlIGRldGVybWluZWQgYnkgc29jaWV0YWwgZXZlbnRzLCBzdWNoIGFzIENvdmlkIG9yIFN1bW1lciwgYWdlLCBnZW9ncmFwaHkgYW5kIGRlcHJpdmF0aW9uLiAgICANCg0KIyMgUmVjb21tZW5kYXRpb25zIGZyb20gYW5hbHlzaXMgDQpUaGlzIHJlcG9ydCBoaWdobGlnaHRzIHRoYXQgdGhlcmUgYXJlIGRpc3Bhcml0aWVzIGluIHByZXNjcmliaW5nIG9mIGVtZXJnZW5jeSBjb250cmFjZXB0aW9uIGFjcm9zcyBnZW9ncmFwaHkgYW5kIHNvY2lhbCBncm91cHMgaW4gU2NvdGxhbmQuIEZ1cnRoZXIgaW52ZXN0aWdhdGlvbnMgaW50byB0aGUgcmVhc29ucyBiZWhpbmQgdGhlc2UgdHJlbmRzIGlzIG5lY2Vzc2FyeSB0byBpbmZvcm0gZnV0dXJlIHNleHVhbCBoZWFsdGggcG9saWN5IG1ha2luZyBhbmQgcmVkdWNlIGhlYWx0aCBpbmVxdWFsaXR5Lg0KDQojIyBMaW1pdGF0aW9ucyBvZiB0aGUgZGF0YXNldCBhbmQgc3VnZ2VzdGlvbnMgZm9yIGZ1dHVyZSBhbmFseXNpcw0KDQpUaGlzIHJlcG9ydCBhc3N1bWVzIHRoYXQgTGV2b25vcmdlc3RyZWwgYW5kIFVsaXByaXN0YWwgQWNldGF0ZSBhcmUgZGlzcGVuc2VkIHB1cmVseSBmb3IgZW1lcmdlbmN5IGNvbnRyYWNlcHRpb24sIGFuZCBoYXZlIG5vIG9mZi1saWNlbmNlIHVzZXMuDQoNCkRpZmZlcmVuY2VzIGluIHRoZSB2b2x1bWUgb2YgRUNQIHByZXNjcmliZWQgaW4gSGVhbHRoIEJvYXJkcyBtYXkgYmUgZHVlIHRvIHBhdGllbnRzIGxpdmluZyBpbiBvbmUgYXJlYSBidXQgYWNjZXNzaW5nIEVDUCBmcm9tIGFub3RoZXIgSGVhbHRoIEJvYXJkLiANCg0KUHJlc2NyaXB0aW9uIGRhdGFzZXQgaGFkICdkdW1teSBwcmFjdGljZSBjb2RlcycgZm9yIHByZXNjcmlwdGlvbnMgd2hpY2ggZGlkIG5vdCBoYXZlIGEgcHJhY3RpY2UgY29kZS4gVGhpcyBleGNsdWRlZCBhIGxhcmdlIG51bWJlciBvZiBFQ1AgcHJlc2NyaXB0aW9ucyBmcm9tIHRoZSBFQ1AtZGVwcml2YXRpb24gYW5hbHlzaXMgYXMgaXQgd2FzIGltcG9zc2libGUgdG8gbGluayB0aGVtIHRvIGEgZGF0YXpvbmUgYW5kIHN1YnNlcXVlbnQgU0lNRCBkZWNpbGUuIA0KDQpXaXRoIGFkZGl0aW9uYWwgdGltZSBpdCB3b3VsZCBiZSBpbnRlcmVzdGluZyB0byBkZXNpZ24gYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoaWMgdG8gdmlzdWFsbHkgYW5kIG1hdGhlbWF0aWNhbGx5IG1vZGVsIHRoZSBwcm9iYWJpbGlzdGljIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB2YXJpYWJsZXMgc3VjaCBhcyBhZ2UsIGRlcHJpdmF0aW9uIGFuZCBnZW9ncmFwaHkgaW5mbHVlbmNpbmcgcHJlc2NyaWJpbmcgcGF0dGVybnMgaW4gU2NvdGxhbmQuIEl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIGV4cGxvcmUgd2hldGhlciB0aGVyZSBhcmUgc3RhdGlzdGljYWwgcmVsYXRpb25zaGlwcyBpbiB0aGUgdHJlbmRzIG9ic2VydmVkIGluIHRoaXMgcmVwb3J0LiANCg0KIyBSZWZlcmVuY2VzIA0KSSBsaW5rZWQgdGhpcyBybWQgdG8gWm90ZXJvIFJlZmVyZW5jaW5nIFNvZnR3YXJlIHRvIHByb2R1Y2UgaW4gdGV4dCBjaXRhdGlvbnMgd2l0aCBhbiB1cGRhdGluZyBiaWJsaW9ncmFwaHkuIEkgY2hvc2UgdG8gZm9ybWF0IG15IHJlZmVybmNlcyBpbiBCTUogaG91c2Ugc3R5bGUgYXMgdGhpcyBpcyBjb21tb25seSB1c2VkIGluIG1lZGljYWwgbGl0ZXJhdHVyZS4NCg0K